KMP算法求解什么类型问题
字符串匹配。给你两个字符串,寻找其中一个字符串是否包含另一个字符串,如果包含,返回包含的起始位置。
讲道理
大串A(长度n) 小串B(长度m)
一般匹配字符串,一个一个比,当前字符对了则比对下一个,不对了再从B的头开始比,移动一个位置;这样的时间复杂度是O(n*m)
KMP可以实现复杂度为O(m+n)
改进的点就在于通过当发生不匹配时,之前匹配完成的部分的信息的利用:B串能往前走不止是1;
概念
最大相同前后缀
abcdab—–ab
ababa——-aba
构建一个与B对应的next数组,记录在当前这个位置字符的前边的字符构成的字符串的最大相同前后缀的值;
上个图,网上找的:
说白了就是构建一个这个:
当AB不匹配,则直接让3对过来。
理解这个图,比看懂算法更重要;
public static int next(int[] rootInt,int rootInt_position){
int[] next = new int[rootInt.length];
int position,key = 0;
for (position = 1;position<rootInt_position;position++ ){
if (key>0&&rootInt[position]!=rootInt[key]){
key=next[key-1];
}
if (rootInt[position]==rootInt[key]){
key++;
}
next[position]=key;
}
key = rootInt_position - key;//这里是直接返回了应该移动的距离
return key;
}
next表中用什么值无所谓,因为你后期要用的时候可以稍加处理;
只要能将目标距离得到即可;
前期陷进了每次匹配都计算一个next的误区,后发现前期对B先进行处理(即next的计算)即可。