一个冷知识:
kmp的next数组有两种写法,一种是教科书上常用的以-1,0为开头的,一种是竞赛中常用的以0为开头的,两种所求next数组不同,后续使用方式也不同,代码自然也不尽相同,但是思路一致,找出一种适合自己的写法理解记忆就好,不用过于纠结。
代码如下:
public class KMP算法 {
public static void main(String[] args) {
String s1="ABCDABEEEEABCDABCD";
String s2="ABCDABCD";
int index=KMP(s1,s2);
System.out.println(index);
System.out.println(s1.charAt(index));
}
public static int KMP(String s1,String s2){
char[] c1=s1.toCharArray();
char[] c2=s2.toCharArray();
int[] next=getNext(c2);
int i=0;
int j=0;
while (i0){
j=next[j];
}
else {
i++;
}
}
return j==c2.length?i-j:-1;
}
public static int[] getNext(char[] c){
int len=c.length;
if(len==1){
return new int[]{-1};
}
int[] next=new int[len];
next[0]=-1;
next[1]=0;
int i=2;
//判断的是i前面字符串的前缀和后缀
int cn=0;
//cn代表前一个位置的最大长度,同样也是在c中的下标
while (i0){
cn=next[cn];
}
else {
next[i++]=0;
}}
return next;
}}
【java|KMP算法实现(java日记)】
推荐阅读
- JavaEE|ServletContext(运行环境信息)
- golang|LeetCode26 删除有序数组中的重复项 Go语言
- java|P1009 [NOIP1998 普及组] 阶乘之和
- 面试|力扣刷题记录
- Mybatis|Mybatis XML动态SQL
- 【Java面试】什么是 ISR,为什么需要引入 ISR
- #|向上转型和向下转型
- 开发技能点|Sentinel 概述
- web前端|web前端day01