文章目录
1.暴力匹配
匹配成功的最好时间复杂度:O(m)
匹配失败的最好时间复杂度:O(n-m+1) = O(n)
最坏时间复杂度:O(nm)
int Index(SSring 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; //i进行暴力回溯
}
if(j>T.length)
return i-T.length;
else
return 0;
}
2.初识KMP
暴力匹配算法的缺点:当某些子串与模式串能部分匹配时,若遇到失配,主串的扫描指针 i 经常回溯,导致时间开销增加。
KMP算法:尝试让主串中的指针 i 不回溯,而让模式串的指针 j 回溯到合适位置。
举一个例子:
如下图,最后一个字符 j = 6
失配,以人脑来考虑,可以直接让模式串与从 i 开始处与主串匹配。不再做其他无用的匹配。
也就是:
i 不动,模式串指针 j 回溯到 j=1
位置,然后继续与 i 当前所指向继续