kmp算法(java)
问题:给定一个字符串bacbababadababacambabacaddababacasdsd求出第一次出现子串ababaca的坐标(从0开始) ans=10;
算法:1.求一个next[i]数组,这个数组表示前缀和后缀相等的最大值。
2.扫描字符串,如果ij相等后加加,不相等j退回到next[j]的地方,最后可以从j的长度判断出是否匹配成功。.
import java.util.Scanner; public class Main{ public static void getNext(String pattern,int[] next) { char[] str=pattern.toCharArray(); int j,k,len; j=0; k=-1; next[0]=-1; while(j<str.length-1){ if(k == -1 || str[j] == str[k]){ j++;k++; next[j] = k; } else k = next[k]; } } public static int kmp(String r,String pattern) { int i,j,len1,len2; char[] str1=r.toCharArray(); char[] str2=pattern.toCharArray(); len1=str1.length; len2=str2.length; i=j=0; int[] next=new int[len2]; getNext(pattern, next); while(i<len1&&j<len2) { if(j==-1||str1[i]==str2[j]) { i++; j++; }else j=next[j]; } if(j>=len2)return i-len2; return -1; } public static void main(String arg[]) { Scanner sc=new Scanner(System.in); String str=sc.next(); String res=sc.next(); System.out.println(kmp(str,res)); } }
stay hungry stay foolish

浙公网安备 33010602011771号