假设主 串是s,子串是t;(s.size() <t.size());
首先我们需要求next[t.size()](至于为什么要求,可以参考其他的博文,有很多大佬总结的极其详细,我只是为了记录一下),next数组的作用:当我们遇到不相等的字符的时候,我们指向子串的指针应该指向什么地方。
bool kmp(string s,sring t){
int num_s = s.size();
int num_t = t.size();
//求next数组
vector<int> next(num_t+1);//易错点1
int i=0;
int j = -1;
next[i] = j;
while(i<num_t){
if(j == -1 || t[i] == t[j]){
i++;
j++;
next[i] = j;
}else{
j = next[j];
}
}
//字符串是否匹配
i = 0;
j = 0;
while(i < num_s && j<num_t){
if(j == -1 || s[i] == t[j]){
i++;
j++;
}else{
j = next[j];
}
}
if(j == num_t) return true;
return false;
}