KMP算法(一)见链接:https://blog.youkuaiyun.com/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的值。