1、引言
①字符串匹配,暴力时间复杂度O(N*M),一旦发生匹配失败,S串和T串都要回退到起点,重新开始一轮匹配。
int ViolentMatch(char* s, char* t)
{
int sLen = strlen(s);
int tLen = strlen(t);
for(int i=0;i<sLen;i++){ //S串
int j=0;
for(;j<tLen;j++){ //T串
if(s[i+j]!=t[j]) break; //匹配失败
}
if(j==tLen) return i; //匹配完全
}
return -1;
}
暴露问题:一旦发生失败,S串和T串都需要回退到起始匹配点。有什么方法可以只让T串回退,S串不回退?KMP应用而生。
②KMP时间复杂度O(N+M)
思路:每次匹配失败,能不能不回退,S串不回退,T串回退到最大前缀,引入next数组。
参考:https://blog.csdn.net/wardseptember/article/details/78801491