LPS(Longest Proper Prefix,也是后缀)算法如下:
public static int[] constructLPSArray(String s) {
int n = s.length();
int[] arr = new int[n];
int j = 0;
for (int i = 1; i < n; ) {
if (s.charAt(i) == s.charAt(j)) {
arr[i] = j + 1;
i++;
j++;
} else {
if (j != 0) {
j = arr[j - 1];
} else {
i++;
}
}
}
return arr;
}
部分看起来清晰,if (s.charAt(i) == s.charAt(j))
但else
部分不清楚。我们为什么这样做:
if (j != 0) {
j = arr[j - 1];
} else {
i++;
}
更具体地说,为什么j = arr[j - 1]
有效?或者我们为什么要这样做?我们如何验证这一步的正确性?