这个时LeetCode上的一道题,具体的解题思路就不再重复了,网上很多自己查询,代码如下:
int kmp(string s, string t) {
if (0 == s.size() && 0 == t.size()) {
return 0;
} else if (0 == s.size() && 0 != t.size()) {
return -1;
} else if (0 != s.size() && 0 == t.size()) {
return 0;
}
int i = 0, j = 0;
vector<int> next = getNext(t);
while (s[i] != '\0' && t[j] != '\0') {
if (s[i] == t[j]) {
i++;
j++;
} else {
j = next[j];
}
if (-1 == j) {
i++;
j++;
}
}
if (t[j] == '\0') {
return i-j;
}
return -1;
}
vector<int> getNext(string t) {
vector<int> next(t.size(), 0);
next[0] = -1;
int k = 0;
for (int j = 2; j < t.size(); j++) {
while (k>0 && t[k] != t[j-1]) {
k = next[k];
}
if (t[k] == t[j-1]) {
k++;
}
next[j] = k;
}
return next;
}