kmp算法
kmp算法为解决BF算法的缺点提出了更好的解决方法, 理解不了最好的办法就是背一背
kmp算法的原理参考
求next数组模板(java)
public static int[] kmpNext(String dest) {
//创建next数组
int[] next = new int[dest.length()];
next[0] = 0;
//i从1开始 j从0开始
for(int i =1,j =0;i<dest.length();i++) {
//while 的情况 j> 0 将j-1位置的next数组值赋值给j
while(j>0 && dest.charAt(i) != dest.charAt(j)) {
j = next[j-1];
}
//相等一律j++
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}
//最后记得赋值
next[i] = j;
}
return next;
}
kmp的算法模板(java)
public static int kmp(String S,String dest,int[] next) {
//遍历长字符串
for(int i =0,j=0;i<S.length();i++) {
//i和j都从0开始 //while不相同返回 j = next[j-1];
while(j>0 && S.charAt(i) !=dest.charAt(j)) {
j = next[j-1];
}
//如果字符相同 j++
if(S.charAt(i) == dest.charAt(j)) {
j++;
}
//如果j==目标长度 相当于大于下标
//返回 i-j+1
if(j == dest.length()) {
return i-j+1;
}
}
return -1;
}
源码及测试
public class KMPalgorithm {
public static void main(String[] args) {
String S ="ASDASFDASFASDADADADAS";
String dest = "DASFA";
System.out.println(kmp(S,dest,kmpNext(dest)));
}
public static int kmp(String S,String dest,int[] next) {
//遍历长字符串
for(int i =0,j=0;i<S.length();i++) {
//i和j都从0开始
while(j>0 && S.charAt(i) !=dest.charAt(j)) {
j = next[j-1];
}
//相等 j++
if(S.charAt(i) == dest.charAt(j)) {
j++;
}
//如果j==目标长度 相当于大于下标
//返回 i-j+1
if(j == dest.length()) {
return i-j+1;
}
}
return -1;
//如果相同 j++
//while不相同返回 j = next[j-1];
//如果j== dest的长度 返回 i-j+1
}
public static int[] kmpNext(String dest) {
//创建next数组
int[] next = new int[dest.length()];
next[0] = 0;
//i从1开始 j从0开始
for(int i =1,j =0;i<dest.length();i++) {
//while 的情况 j> 0
while(j>0 && dest.charAt(i) != dest.charAt(j)) {
j = next[j-1];
}
//相等一律j++
if(dest.charAt(i) == dest.charAt(j)) {
j++;
}
//最后记得赋值
next[i] = j;
}
return next;
}
}