KMP子字符串查找算法.java

package string;

class KMP{
    private String pat;
    private int[][] dfa;
    public  KMP(String pat){//由模式字符串构dfa
        this.pat = pat;
        int M = pat.length();
        int R = 256;
        dfa = new int[M][R];
        dfa[0][pat.charAt(0)] = 1;//其他的默认为0
        //推广一下有限状态自动机,上面的下一个状态正好是j+1而已,而真正的下一个状态应该是dfa[X][pat.charAt(j)]
        for(int X=0,j=1;j<M;j++){
            System.out.println(X);
            for(int c=0;c<R;c++)
                dfa[j][c] = dfa[X][c];
            dfa[j][pat.charAt(j)] = j+1;
            X = dfa[X][pat.charAt(j)];//要好好理解这句话,

        }   
    }
    public int search(String txt){
        int i,j=0,N = txt.length(),M=pat.length();
        for(i=0;i<N&&j<M;i++)
            j = dfa[j][txt.charAt(i)];
        if(j == M)
            return i-M;
        else
            return N;

    }
}

public class KMP子字符串查找算法 {
    public static void main(String[] args) {
        //String pat = "abacab";//0 0 1 0 1
        String pat = "ababac";//0 0 1 2 3
        KMP kmp = new KMP(pat);
        System.out.println(kmp.search("abababababababacabac"));
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值