(本文推荐电脑观看)
串的模式算法——————BF算法
算法的思路:从S(主串)的每一个字符开始依次与T(模式串)的字符进行匹配 (从0开始)
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算法
定义next[j]函数表明当模式中第j个字符与主串中相应字符“失败”时,在模式中需要重新和主串中该字符进行比较的字符的位置
j: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
--------------------------------------------------
模式串: | a b c a a b b c a b c a a b d a b
--------------------------------------------------
next[j]: | 0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2
KMP算法:
int Index_KMP(SString S,SString T,int pos){
i=pos,j=1;
while(i<S.length && j<T.length){
if(j == 0 || S.ch[i]==T.ch[j]) {i++;j++}
else j = next[j]; //i不变,j后退
}
if( > T.length) return i-T.length; //匹配成功
else return 0; //返回不匹配标志
}
KMP算法改进型:增加nextval
void get_nextval(SString T,int & nextval[]) {
i=1; nextval[1]=0; j=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];
}
}