KMP算法详解
作者是通过PPT来进行学习的,百度网盘的链接在下面:
链接:https://pan.baidu.com/s/1cebVaXwwsFa7-Fh1O2sd3A
提取码:6666
一、基本思想
1.2、KMP算法基本思想
KMP算法当中最主要的部分是是前面的那个公式:
当模式串的指针指向j的时候,前j-1个字符当中,从0开始往右边数k个字符,从j-1开始往左边数k个字符,如果这个字符是相等的,则next[j] = k;
-1 ,j = 0
next[j]= max {k | 1≤k<j 且T[0] … T[k -1] = T[j-k]… T[j - 1]}
0,其它情况
1.3、改进后的KMP算法
实际上KMP算法还可以继续完善。如果取主串ababc,模式串为ababa,当i=4,j=4的时候,c不等于a,于是j= next[4]=2,模式串的第2号位和4号位是相等,因为第4号的a已经和主串的第4号位c已经比过了,所以第2号位的a和主串的第4号位c没有必要再比较了,直接跳过去使得j=0。
二、代码实现
2.1、源代码
public class KMP {
public static void main(String[] args) {
String mainStr = "abababc";
String subStr = "ababc";
KMP kmp = new KMP();
System.out.println(kmp.patternMatching(mainStr,subStr));
}
public int[] getNext(String T) {
int[] next = new int[T.length()];
int j = 0;
int k = -1;
next[0] = -1;
while (j < T.length() - 1) {
if (k == -1 || T.charAt(j) == T.charAt(k)) {
k++;
j++;
next[j] = k;
} else {
k = next[k];
}
}
return next;
}
public int[] getNextVal(String T) {
int[] nextVal = new int[T.length()];
int j = 0;
int k = -1;
nextVal[0] = -1;
while (j < T.length() - 1) {
if (k == -1 || T.charAt(j) == T.charAt(k)) {
k++;
j++;
if (T.charAt(j) == T.charAt(k)) {
nextVal[j] = nextVal[k];
} else {
nextVal[j] = k;
}
} else {
k = nextVal[k];
}
}
return nextVal;
}
public int patternMatching(String S, String T) {
int[] next = getNext(T);
int i = 0;
int j = 0;
while (i < S.length() && j < T.length()) {
if (j == -1 || S.charAt(i) == T.charAt(j)) {
i++;
j++;
} else {
j = next[j];
}
}
if (j >= T.length()) {
return i - T.length();
} else {
return 0;
}
}
}
2.2、运行结果
2
(j >= T.length()) {
return i - T.length();
} else {
return 0;
}
}
}
## 2.2、运行结果
```java
2