KMP算法 - NOTE
KMP算法:子串匹配算法
这个算法我查阅了很多资料都啃不下来,最终在一个B站的UP主的视频里面找到了感觉,大家有兴趣可以去看一下那个视频(仅是原理讲解):天勤公开课」KMP算法易懂版
本渣渣看完视频后自己写了一个我觉得比较好理解的代码欢迎大家指正:
public class KMP {
public static void main(String[] args) {
String str = "asdsdsaadsds"; //待查询串
String sonStr = "dsd"; //子串
int[] next = nextArr(sonStr); //构建子串对应的next数组
int j = 0;
for(int i = 0; i < str.length(); i++){
/**
* 字符匹配
* 如果相等则一直检验下去,直到j等于子串的长度的时候,证明匹配成功
* 否则,子串回溯到当前位置前 最大相同子串+1 处,即next数组对应的值,继续匹配
*/
if(str.charAt(i) == sonStr.charAt(j)){
j++;
}else{
j = next[j + 1];
}
//j等于子串长度,匹配成功,返回成功匹配子串的首索引位置
if(j == sonStr.length()){
System.out.println("匹配成功,首地址为: " + (i + 1 -sonStr.length()));
return;
}
}
System.out.println("匹配失败");
}
//构建next数组
private static int[] nextArr(String sonStr) {
int length = sonStr.length();
int[] next = new int[length + 1];
next[0] = 0;
for (int i = 1; i <= length; i++) {
next[i] = maxSubString(sonStr, i);
}
return next;
}
//子串当前索引前的最大相同子串长度
private static int maxSubString(String sonStr, int index) {
int max = 0;
if (index > 1) {
//不能大于index-1,否则将没有意义
for (int k = 0; k < index-1; k++) {
if (sonStr.substring(0, k).equals(sonStr.substring(index - k - 1, index - 1))) {
max = k + 1;
}
}
}
return max;
}
}