vector<int> getNext(string a, string b) {
int n = a.size();
int m = b.size();
int i = 0;
int j = -1;
vector<int> next(n + 1, 0);
next[0] = -1;
while (i < n) {
if (j == -1 || a[i] == b[j]) {
i ++;
j ++; //1. 长度是下标+1
next[i] = j; //2. 将当前的匹配长度更新到后一位
}
else {
j = next[j];
}
}
return next;
}
最后, 3. 这里的理解
int i = 0;
int j = -1;
其实,这里本应该是 $i = 1, j = 0$, 然后方便可以等价上式.
虽然求next数组, 和主函数求匹配都是用同样的思路;
但是不同的是求next的数组的时候i从1开始,匹配的时候i从0开始。