回朔法/KMP算法-查找字符串
- 回朔法:在字符串查找的时候最容易想到的是暴力查找,也就是回朔法。其思路是将要寻找的串的每个字符取出,然后按顺序在源串中查找,如果找到则返回true,否则源串索引向后移动一位,再重复查找,直到找到返回true,或者源串查找完也没有找到返回false;这种方法简单粗暴,但思路清晰。又因为每次查找失败,源串需要回到起始位置的下一个位置开始查找,所以该算法也称为回朔法。
- KMP算法:先对要查找的字符串进行分析,找出其中重复的子字符串。然后将目标串与源串比较,一旦比较失败,则不用回朔,而是根据目标串子串的重复情况,直接调到重复子串的下一个位置。这样减少了大量的回朔,算法复杂度得意大量减小。
下面代码演示了回朔法和KMP算法,并作测试。
KMP算法查找:
package org.lyk.impl; public class KMP<T>
{
public boolean comtains(T[] source, T[] target) throws Exception
{
if(source == null || target == null)
{
throw new Exception("比较目标不能为空");
} int sourceLength = source.length;
int targetLength = target.length;
if(targetLength > sourceLength)
//目标串长达大于源串,肯定不存在,直接返回false
return false;
else if(targetLength == sourceLength)
{
//两个串长度相等,则挨个比较,若发现任何一个元素不相等,则直接返回false,若所有元素均相等个,则返回true
return this.compair(source, target);
}
else
{//源串长度大于目标串长度,用KMP算法比较 //分析目标串的重复情况,生成next数组
int[] next = this.getNext(target);
int currentSourceIndex = ;
int currentTargetIndex = ; //如果目标串没有到末尾,则继续循环,如果已经到目标串末尾,则说明找到
while(currentTargetIndex < targetLength)
{
//如果源串下标越界,说明查找结束,乜没有找到结果,返回false
if(currentSourceIndex >= sourceLength)
return false; if(source[currentSourceIndex].equals(target[currentTargetIndex]))
{
//两个元素相等,目标串和源串下标向后各移动一位
currentSourceIndex++;
currentTargetIndex++;
}
else
{ //目标串的第一个元素就与源串不相等,则源串向后移动一个位置继续比较
if(currentTargetIndex == )
{
currentSourceIndex++;
} currentTargetIndex = next[currentTargetIndex];
}
}
return true;
}
} private int[] getNext(T[] target)
{
int[] next = new int[target.length];
if(next.length > )
{
for(int i = ; i<target.length; i++)
{
int count = ;
for(int j = ;j < i-; j++)
{
boolean flag = true;
for(int k = ; k <= j; k++)
{
if(target[k] != target[i--j+k])
{
flag = false;
break;
}
}
if(flag == true)
{
count = j+;
}
}
next[i] = count;
}
}
return next;
} private boolean compair(T[] source, T[]target)
{
for(int i = ; i < source.length; i++)
{
if(!source[i].equals(target))
return false;
}
return true;
}
}
回朔法(暴力比较)查找字符串:
public static boolean strContain_BF(String _source, String _target)
{
boolean retVal = false;
if (null == _source || null == _target || "".equals(_source) || "".equals(_target))
return false;
char[] source = _source.toCharArray();
char[] target = _target.toCharArray();
int sourceLength = source.length;
int targetLength = target.length;
if (targetLength > sourceLength)
return false;
else if (targetLength == sourceLength)
{
for (int i = ; i < sourceLength; i++)
{
if (source[i] != target[i])
return false;
}
return true;
} else
{
for (int i = ; i <= sourceLength - targetLength; i++)
{
boolean flag = true;
for (int j = ; j < targetLength; j++)
{
if (target[j] != source[i + j])
{
flag = false;
break;
}
}
if (flag == true)
return true;
}
return false;
}
}
回朔法/KMP算法-查找字符串的更多相关文章
- KMP算法查找字符串
假设长字符串为t,短字符串为p.为了进行KMP匹配,首先需要计算字符串p的next数组,后面实现了计算该数组的函数void KmpGenNext(char* p, int* next).对于”abca ...
- 数据结构与算法--KMP算法查找子字符串
数据结构与算法--KMP算法查找子字符串 部分内容和图片来自这三篇文章: 这篇文章.这篇文章.还有这篇他们写得非常棒.结合他们的解释和自己的理解,完成了本文. 上一节介绍了暴力法查找子字符串,同时也发 ...
- 【剑指offer12】矩阵中的路径(回朔法),C++实现
1.题目 请设计一个函数,用来判断在一个矩阵中是否存在一条包含某字符串所有字符的路径.路径可以从矩阵中的任意一个格子开始,每一步可以在矩阵中向左,向右,向上,向下移动一个格子.如果一条路径经过了矩阵中 ...
- 基于KMP算法的字符串模式匹配问题
基于KMP算法的字符匹配问题 反正整个清明都在纠结这玩意...差点我以为下个清明要给自己过了. 至于大体的理解,我就不再多说了(还要画图多麻烦鸭),我参考了以下两个博客,写的真的不错,我放了超链接,点 ...
- 51NOD 1292 1277(KMP算法,字符串中的有限状态自动机)
在前两天的CCPC网络赛中...被一发KMP题卡了住了...遂决定,哪里跌倒就在哪里爬起来...把个KMP恶补一发,连带着把AC自动机什么的也整上. 首先,介绍设定:KMP算法计划解决的基本问题是,两 ...
- KMP算法 (字符串的匹配)
视频参考 对于正常的字符串模式匹配,主串长度为m,子串为n,时间复杂度会到达O(m*n),而如果用KMP算法,复杂度将会减少线型时间O(m+n). 设主串为ptr="ababaaababaa ...
- KMP算法在字符串中的应用
KMP算法是处理字符串匹配的一种高效算法 它首先用O(m)的时间对模板进行预处理,然后用O(n)的时间完成匹配.从渐进的意义上说,这样时间复杂度已经是最好的了,需要O(m+n)时间.对KMP的学习可以 ...
- 字符串匹配算法之————KMP算法
上一篇中讲到暴力法字符串匹配算法,但是暴力法明显存在这样一个问题:一次只移动一个字符.但实际上,针对不同的匹配情况,每次移动的间隔可以更大,没有必要每次只是移动一位: 关于KMP算法的描述,推荐一篇博 ...
- 字符串匹配的KMP算法详解及C#实现
字符串匹配是计算机的基本任务之一. 举例来说,有一个字符串"BBC ABCDAB ABCDABCDABDE",我想知道,里面是否包含另一个字符串"ABCDABD" ...
随机推荐
- 解决outlook不能显示鼠标问题
今天发现打开outlook2010后, 没有鼠标显示. 解决方案: Control Panel -> Mouse Settings ->Pointer Options Uncheck th ...
- HadoopDoctor:来自腾讯数据仓库TDW的MR诊断系统
TDW是基于Hadoop生态圈研发的大数据处理平台,MapReduce计算引擎在TDW平台中承担了所有的离线数据计算,是TDW最重要的底层支撑平台之一.在TDW 平台中,除了MR程序会生成MapRed ...
- HttpSessionBindingListener和HttpSessionAttributeListener区别 - gengkunpeng的专栏 - 博客频道 - CSDN.NET
分享到 一键分享 QQ空间 新浪微博 百度云收藏 人人网 腾讯微博 百度相册 开心网 腾讯朋友 百度贴吧 豆瓣网 搜狐微博 百度新首页 QQ好友 和讯微博 更多... 百度分享 HttpSession ...
- Neutron GRE模式要注意的问题
GRE模式下,如果MTU和Offloading配置不当,会严重降低网络性能(https://ask.openstack.org/en/question/6140/quantum-neutron-gre ...
- Android外派(安卓外派) — 长年提供安卓开发工程师外派业务(可签合同)
北京动点飞扬长年提供安卓工程师外派业务. 平均技术情况如下: 1.2~3年以上Android平台开发经验2.熟练掌握java技术,熟悉面向对象编程设计3.熟悉Android应用开发框架及Activit ...
- ros的相关link
http://markzhang.cn/blog/2014/08/19/ros-basic-setup/ http://blog.csdn.net/boliang319/article/details ...
- python安装psycopg2
vim ~/.bash_profile export PATH=/Applications/Postgres.app/Contents/Versions/9.4/bin/:$PATH pip inst ...
- 【solr】solr5.0整合中文分词器
1.solr自带的分词器远远满足不了中文分词的需求,经查使用最多的分词器是solr是mmseg4j分词器,具体整合大家可以参考 https://github.com/zhuomingliang/mms ...
- 转:Java学习路线图,专为新手定制的Java学习计划建议
转自:http://blog.csdn.net/jinxfei/article/details/5545874 怎么学习Java,这是很多新手经常会问我的问题,现在我简单描述下一个Java初学者到就业 ...
- Linux启动过程详解(转)
启动第一步--加载BIOS当你打开计算机电源,计算机会首先加载BIOS信息,BIOS信息是如此的重要,以至于计算机必须在最开始就找到它.这是因为BIOS中包含了CPU的相关信息.设备启动顺序信息.硬盘 ...