package com;
import java.util.Arrays;
public class Main2 {
//模式串 A B A B A A A B A B A A
//下 标 0 1 2 3 4 5 6 7 8 9 10 11
//next数组 -1 0 0 1 2 3 1 1 2 3 4 5
private static int[] getNext(String s) { //传过来的时模式串,返回的是next数组
int len = s.length(); //获取模式串的长度
char[] p = s.toCharArray(); //把模式串转换成char数组
int[] next = new int[len]; //声明next数组,最后返回
next[0] = -1; //第一位肯定是-1
next[1] = 0; //第二位肯定是0
int j = 1; //遍历next数组用
int k = 0; //next[j]=k k就是next数组中的值
while (j < len - 1){
if (k == -1){ //回溯到0都不匹配,则next值为0
j++;
k = 0;
next[j] = 0;
} else if (p[j] == p[k]){ //找到了匹配的,对应next值+1
j++;
k++;
next[j] = k;
} else { //不匹配,指针回溯
k = next[k];
}
}
return next; //返回next数组
}
private static int kmp(String mainString, String patternString) { //主串和模式串
char[] mainStringChar = mainString.toCharArray(); //主串转成char数组
char[] patternStringChar = patternString.toCharArray(); //模式串转成char数组
int mainStringLength = mainString.length(); //得到主串的长度
int patternStringLength = patternString.length(); //得到模式串的长度
int result = -1; //最终要返回的索引,默认为-1
int i = 0, j = 0;
int[] next = getNext(patternString); //获得next数组
while (i < mainStringLength) { //扫描主串
if (j == -1 || mainStringChar[i] == patternStringChar[j]) {
i++;
j++;
} else {
j = next[j];
}
if (j == patternStringLength) {
result = i - patternStringLength;
break;
}
}
return result;
}
public static void main(String[] args) {
String s1 = "ABABAAABABAA";
String s2 = "ABAA";
System.out.println(Arrays.toString(getNext(s1)));
System.out.println(kmp(s1, s2));
}
}
KMP算法,next数组,Java实现
最新推荐文章于 2025-03-04 00:08:31 发布