字符串匹配的KMP算法
class Solution {
public:
int strStr(string haystack, string needle) {
int hlen = haystack.size();
int nlen = needle.size();
int next[nlen];
getNext(needle, next);
int i = 0;
int j = 0;
while(i < hlen && j < nlen){
if(j == -1 || haystack[i] == needle[j])
{// match current position, go next
i ++;
j ++;
}
else
{// jump to the previous position to try matching
j = next[j];
}
}
if(j == nlen)
// all match
return i-nlen;
else
return -1;
}
void getNext(string needle, int next[])
{// self match to contruct next array
int nlen = needle.size();
int j = -1; // slow pointer
int i = 0; // fast pointer
next[i] = -1; //init next has one element
while(i < nlen-1)
{
if(j == -1 || needle[i] == needle[j])
{
j ++;
i ++; //thus the condition (i < nlen-1)
next[i] = j; //if position i not match, jump to position j
}
else
{
j = next[j]; //jump to the previous position to try matching
}
}
}
};