KMP字符串匹配
- 先求模式串的最大公共前后缀函数
- 求最大公共前后缀函数的时候用到了长度较小的最大公共前后缀函数
class Solution {
public:
int strStr(string haystack, string needle) {
int n = haystack.size();
int m = needle.size();
if(m ==0){
return 0;
}
vector<int>pi(m);
for(int i = 1,j=0;i<m;i++){
while(j > 0 && needle[i] != needle[j]){
j = pi[j-1];
}
if(needle[i] == needle[j]){
j++;
}
pi[i] = j;
}
for(int i =0,j=0;i<n;i++){
while(j>0 && haystack[i] != needle[j]){
j = pi[j-1];
}
if(haystack[i] == needle[j]){
j++;
}
if(j == m){
return i-m+1;
}
}
return -1;
}
};