模式匹配目前有两种方法: BF算法和KMP算法
BF算法
思路:
从目标串的第一个字符和模式串的第一个字符开始,依次比较每个字符,如果相同指针同步后移比较后续字符,如果不同i指针后移一个,j指针回到第一个字符重新匹配,若匹配成功就返回模式串t中第一个字符在目标串中的位置,失败返回0
代码:
int index(Sqstring s,Sqstring t){
int i=j=1; //下标从1开始
while(i<=s.length&&j<=t.length){ //在长度范围内
if(s.ch[i]==t.ch[j]){
i++; //指针同步后移
j++;
}else{
i=i-j+2; //i指针后移一个(这里用这个公式会比较简单)
j=1; //j指针回到第一个字符开始重新匹配
}
}
if(j>t.length) return i-t.length; //模式串超过长度了,说明匹配完了返回模式串的长度
else return 0; //如果是目标串超过长度,说明目标串都遍历完了还没有匹配成功,则返回0表示失败
}
这里如果你想让下标从0开始,就设i=j=0且后面公式改为i=i-j+1
若模式串长度为m,目标串长度为n,则直到匹配成功/匹配失败最多需要(n-m+1)*m次比较
最坏情况:每个子串的前m-1个字符都和模式串匹配,只有第m个字符不匹配
所以最坏时间复杂度: O(nm)
比较好的情况:每个子串的第1个字符就与模式串不匹配
KMP算法
串的前缀:包含第一个字符,且不包含最后一个字符的子串
串的后缀:包含最后一个字符,且不包含第一个字符的子串
手算next数组:
雷打不动next[1]=0,next[2]=1