KMP算法实现
参考:https://blog.csdn.net/yearn520/article/details/6729426?spm=1001.2101.3001.6661.1&utm_medium=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-1.pc_relevant_default&utm_relevant_index=1
class Solution {
public:
int strStr(string s, string p) {
int n = s.size();
int m = p.size();
if(m==0) return 0;
//哨兵
s.insert(s.begin(),' ');
p.insert(p.begin(),' ');
vector<int> next(m+1);
//建立next数组
for(int i=2,j=0;i<=m;i++){
while(j && p[i]!=p[j+1]) j = next[j];
if(p[i]==p[j+1]) j++;
next[i] = j;
}
//KMP过程
for(int i =1,j=0;i<=n;i++){
while(j && s[i]!=p[j+1]) j = next[j];
if(s[i]==p[j+1]) j++;
if(j==m) return i-m;
}
return -1;
}
};

浙公网安备 33010602011771号