{
//其中,t非空,1≤pos≤StrLength(s)
int i,j;
i = pos-1; //下标
j = 0; //下标
while(i<s.length && j<t.length){
if(s.ch[i]==t.ch[j]){++i; ++j;} //继续比较后继字符
else{i=i-j+1; j=0;} //指针后退重新开始匹配
}
if(j==t.length) return i-t.length+1; //模式串全部读完,表示匹配,返回开始匹配位置的下标
else return 0;
}
以上为BF算法的实现代码:BF算法比较“简单粗暴”,主串每次匹配失败之后都要往右移动一个单位,字串重新计数,因此其时间复杂度为O(m*n)。
BF算法需要注意的是:
1、容易混淆下标与位置
2、对于数据容量过大的串难以进行匹配。
因此引入了KMP算法:
优点:在字串存在有相同的前后缀时,主串不回溯,模式向右滑动1个或多个位置。
如下表:
(图片来自http://www.cnblogs.com/yahong/archive/2013/11/13/3420565.html 以及晓梅老师上传的KMP讲解文件)
因此KMP需要添加k( k = “t1..tj-1”前后缀相等字符个数+1):当字串的第j个字符与主串的第i个字符不相等时,i不回溯,j回溯到k,即下一步对si与tk进行比较。
而next数组存放每一个j对应的k。
KMP算法分析:
若无相等前后缀:k=1,移动t1至si。
若第一个字符就不匹配,移动t1至si+1。