class Solution {
int[][] d;
public int strStr(String haystack, String needle) {
if(needle.equals("")){
return 0;
}
int n=needle.length();
d=new int[n][256];
kmp(needle);
return search(haystack, needle);
}
//构造pattern的状态机
void kmp(String p){
//匹配就转移到下一个状态
d[0][p.charAt(0)]=1;
//上个状态
int x=0;
for(int i=1;i<p.length();++i){
for(int j=0;j<256;++j){
if(j==p.charAt(i)){
//匹配就转移到下个状态
d[i][j]=j+1;
}else{
//不匹配就回退到上个有公共前缀的状态
d[i][j]=d[x][j];
}
}
//更新上一个状态
x=d[x][p.charAt(i)];
}
}
int search(String txt,String p){
int n=txt.length();
int m=p.length();
int j=0;
for(int i=0;i<n;++i){
//根据状态机转移状态
j=d[j][txt.charAt(i)];
if(j==m){
return i-m+1;
}
}
return -1;
}
}