加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
kmp算法 1.50 KB
一键复制 编辑 原始数据 按行查看 历史
鸢也12123 提交于 2021-12-22 08:09 . update kmp算法.
public static int KMP(String str,String sub) {
if (str==null || sub==null) return -1;
int lenStr=str.length();
int lenSub=sub.length();
int i=0;
int j=0;
int[] next=new int[lenSub];
getNext(next,sub);
while (i<lenStr && j<lenSub) {
if ( str.charAt(i)==sub.charAt(j)) {
i++;
j++;
} else if(next[j]==-1){//j==0;sub中比对的位置已经无法往前跳了
i++;//str中的i++
}else {
j=next[j];
}
}
if (j>=lenSub) {
return i-j;
}
return -1;
}
public static void getNext(int[] next,String sub){
if (sub==null) return;
next[0]=-1;
next[1]=0;
//人为规定-1,0,所以i从2小标开始
int i=2;
int k=0;//i=2,i-1=1,1下标是0的值,k也指那个字符跟i-1字符比,相同+1
while (i<sub.length()) {
//k=-1时,+1=0;继续i++,
if (k==-1 || sub.charAt(i-1)==sub.charAt(k)) {
next[i]=k+1;
i++;//求下一个i位置
k++;
}else {
k=next[k];//k往前跳
}
}
}
public static void main(String[] args) {
System.out.println(KMP("kdjsls","djs"));
System.out.println(KMP("kdjsls","djsa"));
System.out.println(KMP("kdjsls","kd"));
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化