朴素和KMP模式匹配算法(Java)

朴素模式匹配算法

public class Test {
    //朴素模式匹配算法
    public int Index(String s,String t,int pos){

        int i = pos;//主串中第几个位置开始比较
        int j = 0;//模式串中的第一个位置
        while(i<s.length()&&j<t.length()){

            if(s.charAt(i)==t.charAt(j)){
                i++;
                j++;
            }else {
                i = i-j+1;//主串的下一个位置
                j = 0;//继续第一个位置
            }   
        }

        if (j>=t.length()) {
            return i-t.length();
        }else {
            return -1;
        }

    }

    public static void main(String[] args) {
        Test test = new Test();

        System.out.println(test.Index("goodgoogle", "google", 0));
        System.out.println(test.Index("goodgoogle", "google", 2));

        System.out.println(test.Index("googlegoogle", "google", 0));
        System.out.println(test.Index("googlegoogle", "google", 2));
    }
}

运行结果:

4
4
0
6

KMP模式匹配算法

《朴素和KMP模式匹配算法(Java)》

public class Test {
    public static void main(String[] args) {
        Test test = new Test();

        test.getNext("abcabx");
        test.getNext("abcdex");

        System.out.println(test.indexKMP("goodgoogle", "google", 0));

    }

    //////////KMP模式匹配算法////////////////
    public int[] getNext(String T){
        int[] next = new int[T.length()];
        int i = 0;
        int j = -1;

        next[i] = j;

        while(i<T.length()-1){

            if(j==-1 || T.charAt(i)==T.charAt(j)){
                i++;
                j++;
                next[i] = j;
            }else {
                j = next[j];//若字符不相等,则j值进行回溯。
            }
        }       
        for (int k = 0; k < next.length; k++) {
            System.out.print(next[k]);
        }
        System.out.println();
        return next;
    }

    public int indexKMP(String S,String T,int pos){
        int i = pos;//表示从主串中第几个字符串开始匹配

        int j = 0;//表示从模式串中第几个字符串开始

        int[] next = getNext(T);

        while(i<S.length()&&j<T.length()){
            if (j == -1 || S.charAt(i) == T.charAt(j)) {
                i++;
                j++;
            }
            else {//重新开始匹配
                j = next[j];//j退回到合适的位置,i值不变
            }
        }
        if (j>=T.length()) {
            return i-T.length();
        }else {
            return 0;
        }   
    }
}

运行结果:

-100012 -100000 -100010 4
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/scgaliguodong123_/article/details/49148017
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞