BF算法(暴力)
int index_BF(SString S,SString T)
{
int i=1,j=1;
while(i<=S.length&&j<=T.length)
{
if(S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
i=i-j+2;//回到原来位置的后一位
j=1;//从头开始
}
}
if(j>=T.length)
return i-T.length;
else
return 0;//没匹配成功
}
KMP算法
原理
1.i不回溯,j不回到1
2.字符串的前后缀
前缀:从头开始的子串(不包括最后一位元素),例如abcd的前缀有a,ab,abc
后缀:以最后一位元素结尾(不包括第一位元素),例如abcd的后缀有d,cd,bcd
最长公共前后缀:就是前缀等于后缀时的最长长度
3.next[j]函数
表示当模式串与要找的串相应字符不匹配时,要找的串应该从哪一位与模式串的那个字符相对
next[j]分三种情况:1:next[j]=0 (j==1时)
2:next[j]=max{k|1<k<j,且"p1....p(k-1)"(从头开始的k-1个元素)=="p(j-k+1)...p(j-1)"(j前面的k-1个元素),当此集 合非空时}
3:next[j]=1(其他情况)(若j=1后对应字符仍不相同,则i要前进一位,i=i+1,j=1)
例如:
j 1 2 3 4 5 6 7 8 9
模式串 a b c a a b b c a
next[j] 0 1 1 1 2 2 3 1 1
代码
int index_BF(SString S,SString T)
{
int i=1,j=1;
while(i<=S.length&&j<=T.length)
{
if(j==0||S.ch[i]==T.ch[j])
{
i++;
j++;
}
else
{
j=nextval[j];
}
}
if(j>=T.length)
return i-T.length;
else
return 0;//没匹配成功
}
//nextval[j]函数 (next[j]函数改良版)
void get_nextval(SString T,int &nextval[])
{
i=1,j=0;
nextval[1]=0;
while(i<T.length)
{
if(j==0||T.ch[i]==T.ch[j])
{
++i;
++j;
if(T.ch[i]!=T.ch[j])
nextval[i]=j;
else
nextval[i]=nextval[j];
}
else
j=nextval[j];
}
}
如有错误,欢迎各位大佬指出批评>W<