28. 实现 strStr()
原理
推荐这个解答!
如何更好地理解和掌握 KMP 算法? - 海纳的回答 - 知乎
https://www.zhihu.com/question/21923021/answer/281346746
C++实现
class Solution {
public:
vector<int> getNext(string needle){
// 对自身进行匹配
int i = 0;
int j = -1;
// init
vector<int> next(needle.size() + 1, 0); // 注意大小!
next[0] = -1;
while(i < needle.size()){
if(j == -1 || needle[i] == needle[j]){
i++;
j++;
next[i] = j;
}else{
j = next[j];
}
}
return next;
}
int strStr(string haystack, string needle) {
int hsize = haystack.size();
int nsize = needle.size();
if(nsize == 0){
return 0;
}
if(hsize == 0){
return -1;
}
vector<int> next;
next = getNext(needle);
int i = 0;
int j = 0;
while(i < hsize && j < nsize){
if(j == -1 || haystack[i] == needle[j]){
i++;
j++;
}else{
j = next[j];
}
}
if(j == nsize){
return i - j;
}else{
return -1;
}
}
};