LeetCode的shortest Palindrome 就是基於KMP算法求最短子字符串。
public static int[] longestPS(String s) {
int sLen = s.length();
char[] p = s.toCharArray();
//存放最大前綴後綴數
int[] lNext = new int[sLen];
//最大前後綴數(前綴指針)
int k = 0;
//後綴指針
int j = 1;
while(j < sLen) {
if(p[k] == p[j]) {
//相等則將前一次比較的結果加上這次:k+1;然後繼續加1比較。
lNext[j] = k + 1;
k++; j++;
} else {
//如果p[k] != p[j]則k是不是在初始位置,是的話,K不變,後綴指針加1;
if(k == 0) {
j++;
} else {
//k不爲0,說明指針不在初始位置。根據lNext數組,找到上一個最大前後綴數的位置,繼續判斷。
k = lNext[k-1];
}
}
}
return lNext;
}
/*
* 舉例:字符串 ABDABCE
* 對應的lNext == {0,0,0,1,2,0,0};
*
*/
下面是KMP的next數組代碼,用以比較。
public void GetNext(char* p,int next[]) {
int pLen = strlen(p);
next[0] = -1;
int k = -1;
int j = 0;
while (j < pLen - 1) {
if (k == -1 || p[j] == p[k]) {
++k;
++j;
next[j] = k;
} else {
k = next[k];
}
}
}
如果想要更詳細的學習KMP算法,建議請移步此篇博客,從頭到尾徹底理解KMP,這是我學習中收收穫最多的。