码迷,mamicode.com
首页 > 编程语言 > 详细

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

时间:2015-10-18 23:17:22      阅读:409      评论:0      收藏:0      [点我收藏+]

标签: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模式匹配算法

技术分享

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模式匹配算法(Java)

标签:java   算法   

原文地址:http://blog.csdn.net/scgaliguodong123_/article/details/49148017

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!