KMP算法(一)見鏈接:https://blog.csdn.net/not_say/article/details/105291946
一、KMP算法存在的缺陷及改良:
這裏直接將《大話數據結構》裏面的說明截圖來用了,因爲有畫圖,說明的比較清楚:
public static int[] getNextVal(String son) {
int i = 0, j = -1;
int[] nextVal = new int[son.length()];
nextVal[0] = -1;
while (i < son.length() - 1) {
if (j == -1 || son.charAt(i) == son.charAt(j)) {
i++;
j++;
// 這裏是改良的地方
if (son.charAt(i) != son.charAt(j)) {
// 若當前字符與前綴字符不同,則當前的 j 爲nextVal在 i 位置的值
nextVal[i] = j;
} else {
//若當前字符與前綴字符相同,則將前綴字符的nextVal的值賦給nextVal在i位置的值
nextVal[i] = nextVal[j];
}
} else {
j = nextVal[j];
}
}
return nextVal;
}
二、總結
改進過的KMP算法,它是在計算出next值的同時,如果a位字符與它next值指向的b位字符相等,則該a位的nextVal就指向b位的nextVal值,如果不等,則該a位的nextVal值就是它自己a位的next的值。