在长度为M字符串S1中找到长度为N字符串S2的匹配位置,没有找到返回-1。
使用KMP算法可以在O(M+N)时间复杂度完成。
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scan=new Scanner(System.in);
while(scan.hasNext()){
String s1=scan.next();
String s2=scan.next();
System.out.println(getIndex(s1,s2));
}
}
public static int getIndex(String s1,String s2){//kmp算法
char[]ch1=s1.toCharArray();
char[]ch2=s2.toCharArray();
int[]next=getNext(ch2);
int si=0;
int mi=0;
while(si<ch1.length&&mi<ch2.length){
if(ch1[si]==ch2[mi]){
si++;
mi++;
}else if(next[mi]==-1){
si++;
}else{
mi=next[mi];
}
}
return mi<ch2.length?-1:si-ch2.length;
}
public static int[] getNext(char[] ch){
if(ch.length==1){
return new int[]{-1};
}
int[]next=new int[ch.length];
next[0]=-1;
next[1]=0;
int pos=2;
int cn=0;
while(pos<next.length){
if(ch[pos-1]==ch[cn]){
next[pos++]=cn+1;
}else if(cn>0){
cn=next[cn];
}else{
next[pos++]=0;
}
}
return next;
}
}