Implement strStr().
Returns the index of the first occurrence of needle in haystack, or -1 if needle is not part of haystack.
class Solution {
public:
int strStr(string haystack, string needle) {
const int len1 = haystack.length();
const int len2 = needle.length();
if(len2 > len1)
return -1;
if(len2 == 0)
return 0;
return kmp(haystack, len1, needle, len2);
}
int kmp(string& haystack, int len1, string& needle, int len2){
vector<int> next = get_next(needle, len2);
int i = 0, j = 0;
while(i < len1 && j < len2){
if(j == -1 || haystack[i] == needle[j]){
++i;
++j;
}
else
j = next[j];
}
return j == len2 ? i - len2 : -1;
}
vector<int> get_next(string& needle, int len){
vector<int> next(len, 0);
next[0] = -1;
int k = -1, j = 0;
while(j < len - 1){
if(k == -1 || needle[k] == needle[j])
next[++j] = ++k;
else
k = next[k];
}
return next;
}
};