class Solution {
public:
int strStr(string haystack, string needle) {
//求next数组
vector<int> next(needle.size(), 0);
for (int i = 1, j = 0; i < needle.size();) {
if (needle[i] == needle[j]) { //i和j匹配
next[i] = j + 1; //最长相等前后缀
++j;
++i;
}else{
if (j > 0){ //j不为0,则往前回溯
j = next[j-1];
}else{ //j==0 i前进
i++;
}
}
}
//开始匹配
for (int i = 0, j = 0; i < haystack.size() && j < needle.size();) { // i 指向主串,j 指向模式串
if (haystack[i] == needle[j]) {
if (j == needle.size() - 1)
return int(i - needle.size() + 1);
++i;
++j;
} else {
if (j > 0) {
j = next[j - 1];
} else {
++i;
}
}
}
return -1;
}
};
KMP算法中关于next数组的计算问题:
在计算next数组时
if (j > 0){ //j不为0,则往前回溯 j = next[j-1]; }
此时可以将i
所指的位置当字符当作主串
的字符,将j
所指的位置的字符当作模式串
的字符,当匹配不上时,模式串根据next
数组回溯。