算法讲解:
https://blog.csdn.net/v_july_v/article/details/7041827
代码实现:
vector<int> getNext(string p) {
int len = p.length();
vector<int> next(len, 0);
next[0] = -1;
int k = -1, j = 0;
while (j < len - 1) {
if (k == -1 || p[j] == p[k]) {
k++;
j++;
next[j] = k;
}
else {
k = next[k];
}
}
return next;
}
int match(string s,string p) {
vector<int> next = getNext(p);
int len1 = s.length(), len2 = p.length(), i = 0, j = 0;
while (i < len1 && j < len2) {
if (j==-1||s[i] == p[j]) {
i++; j++;
}
else {
j = next[j];
}
}
if (j >= len2)return j;
else return -1;
}
int main() {
//string s = "aacecaaa";
//string res = shortestPalindrome(s);
string s = "BBC ABCDAB ABCDABCDABE";
string p = "ABCDABD";
int res = match(s, p);
return 0;
}