1.BF算法(暴力算法)
//模式匹配(暴力算法)
int Index(SString S,SString T){
int i=1,j=1;
while(i<=S.length&&j<=T.length){
if(S[i]==T[i]){
i++;
j++;
}else{
i=i-j+2; //最开始匹配的位置的后一个
j=1; //从头匹配
}
}
if(j>T.length)
return i-T.length;
return return 0;
}
时间复杂度分析:O(mn)
假设主串长度为n,待匹配的串长度为m,则最坏时间复杂度为O(nm)。
主串最多需要匹配n-m+1次,每次最多匹配m次(匹配到最后一个发现不匹配了),
所以也就是(n-m+1)*m=nm-m^2+m,因为一般都是n>>m,所以后面的-m^2+m可以省略,也就是O(nm)的时间复杂度。
tips:时间复杂度除非特别指明,一般就是最坏时间复杂度。
2. KMP算法
next[j]表示:当第j个子串的第i个字符与主串发生失配的时候,跳到子串的next[j]位置重新与主串当前位置进行比较。
tips:next[0]=0,next[1]=1(这两始终保持不变)
时间复杂度:O(m+n)
假设主串长度为n,待匹配的串长度为m,则最坏时间复杂度为O(m+n)。
分为两个大步骤:求next[]和匹配。
求next[]:需要对待匹配串进行一个遍历,也就是,次
匹配:需要对主串进行遍历(不回溯),最多n次。
因此最坏时间复杂度为O(m+n)。
3. KMP进一步优化
简单来说,在next[j]基础上进一步修改,
如果p[j]=p[next[j]],那么next[j]=next[next[j]]。