经典问题1(KMP) 给出一个字符串str,问字符串s是否包含str。
常见思路是在s中遍历寻找str,算法复杂度为O(len(str)*len(s)),kmp算法能将复杂度降低到O(len(s))级别,kmp算法的思想主要是通过求匹配字符串每个位置的最长重复前缀,每次匹配失败之后就直接用next数组中的最长匹配前缀那一部分去匹配,而不用重新匹配。
vector<int> getNext(string str){
int len=str.length();
vector<int> res(len,0);
res[0]=-1;
if(len<=1){
return res;
}
res[1]=0;
for(int i=2;i<len;i++){
//每一轮都用前一个字符的next值对应的字符和前一个字符比较
//next代表的含义是 当前下标前面的最长 重复前缀。
int p=i-1;
while(res[p]!=-1&&str[res[p]]!=str[i-1]){
p=res[p];
}
res[i]=res[p]+1;
}
return res;
}
bool kmp(string s,string str){
int i=0;
int j=0;
vector<int> next=getNext(str);
while(i<s.length()&&j<str.length()){
if(s[i]==str[j]){
i++;
j++;
}
else{
if(next[j]>=0){
j=next[j];
}
else{
i++;
}
}
}
r