(1)以字符p为例
(2)KMP算法代码实现
import java.util.Scanner;
public class Main {
/*
* 思路:
* len、begin、end分别表示当前包含所有关键字的子数组最短长度、起始下标
*
*
* 目的:求文字描述数组w中 包含关键字数组q中所有元素的 最短子数组(w中包含q元素的子数组可以与q中的顺序不同,包含即可)
*
* 代码问题:不能处理关键中有相同单词的情况。例如:wo wo ni
* */
public static void main(String[] args){
//KMP算法
//1.设置主串和子串
char[] s1 = "acbababcbabababb".toCharArray();//主串
char[] s2 = "bab".toCharArray();//子串
//2.获取next数组
int[] next = getnext(s2);
//3.比较
int j=0;
for(int i=0;i<s1.length && j<s2.length;) {
if(j==-1 || s2[j]==s1[i]) {
j++;
i++;
}else {
j = next[j];
}
//4.判断是否匹配成功
if(j==s2.length) {
System.out.println("匹配成功,匹配位置为:"+(i-s2.length));
break;
}
}//for
}
//构造next数组
private static int[] getnext(char[] str) {
int[] next = new int[str.length];//next数组
//1.初始化前两个值
next[0]=-1;
next[1]=0;
int k = next[1];
for(int j=1;j<str.length;j++) {
if(k<0 || str[j]==str[k]) {//相等
k++;
j++;
}else {//不等
k = next[k];
}
}
return next;
}
}