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));
    }
}

 

posted @ 2021-03-01 10:28  金龙喩  阅读(73)  评论(0)    收藏  举报