KMP算法实现
参考博客:https://blog.youkuaiyun.com/gao506440410/article/details/81812163
package MyOffer;
import java.util.Scanner;
/**
* 字符字串查找算法:KMP实现
* 参考博客:https://blog.youkuaiyun.com/gao506440410/article/details/81812163
*/
public class KMP {
public static void main(String[] args){
Scanner in=new Scanner(System.in);
String textStr=in.nextLine();
String patternStr=in.nextLine();
System.out.println(Kmp(textStr,patternStr));
}
/** 从文本串中找到模式串的开始位置
* @param textStr 文本串
* @param patternStr 模式串
* @return 文本串中包含模式串,返回模式串第一次出现的首字符的位置;否则返回-1
*/
public static int Kmp(String textStr, String patternStr){
char[] text=textStr.trim().toCharArray();
char[] pattern=patternStr.trim().toCharArray();
int[] next=getNext(pattern);
int textIndex=0;
int patInext=0;
while(textIndex<text.length&&patInext<pattern.length){
if(patInext==-1||text[textIndex]==pattern[patInext]){
textIndex++;
patInext++;
}else{
patInext=next[patInext];
}
}
if(patInext==pattern.length){
return textIndex-patInext;
}else
return -1;
}
private static int[] getNext(char[] pattern){
int[] next = new int[pattern.length];
int k=-1;
int j=0;
next[0]=-1;
while(j<next.length-1){
if(k==-1||pattern[j]==pattern[k]){
k++;
j++;
if(pattern[j]!=pattern[k]){
next[j]=k;
}else{
next[j]=next[k];
}
}else{
k=next[k];
}
}
return next;
}
}