KMP算法及next数组(最大公共前后缀)求解
2020.12.14理解:
1. KMP算法
网上关于KMP算法讲解较为简单易懂,因此在此只作简述:
在字符串s中匹配字符串t:
S: ABE…AB…ABC…
T: ABE…AB…ABD…
当匹配C和D时,因不匹配,只需右移t字符串,匹配C和E(因为AB是最长公共前后缀,且t移动到中间AB后一位开始匹配,必失败)。证明如下图:
2. 最长公共前后缀(next数组)
因为网上关于next数组讲解较为难懂,自己梳理了一遍:
求字符串T各个位上的最大公共前后缀:
T:ABFEABGABFEABC
next[i] 表示T前i+1位字符串的最大公共前后缀
// 求解最大公共前后缀(next数组)
public int[] next(String s) {
// write code here
int[] next = new int[s.length()];
int n = s.length();
int i = 0, j = 1;
while (j < n) {
if (s.charAt(i) == s.charAt(j)) {
next[j] = i + 1;
i++;
j++;
}
else {
if (i == 0) {
// 若已回退到第0位,且仍不匹配
next[j] = 0;
j++;
}
i = next[i - 1]; //不匹配时回退i
}
}</