KMP算法
KMP算法
next数组
next[1]=0,next[2]=1
当第j个字符匹配失败,主串指针i不回溯,只改变模式串中的j指针,
由前1到j-1个字符组成的串记为S,则next[j]=S的最长相等前后缀长度+1
time complexity: O(n+m)
public static int KMP(String s,String t) { int[] next=new int[t.length()]; get_next(t,next); int i=0,j=0; while(i<s.length()&&j<t.length()) { if(j==-1 || s.charAt(i)==t.charAt(j)) { i++; j++; } else j=next[j]; } if(j>=t.length()) return (i-t.length()); else return (-1); } public static int[] get_next(String t,int[] next) { int j=0,k=-1; next[0]=-1; while(j<t.length()-1) { if(k == -1 || t.charAt(j) == t.charAt(k)) { j++; k++; next[j] = k; } else k = next[k]; } return next; }