KMP的思路与实现

来源:互联网 发布:程序员微电影 编辑:程序博客网 时间:2024/06/10 02:44

思路

我就不提为啥有KMP和KMP的原理了,这段跳过。。。首先计算next数组,算法如下:输入:String m;输出:int[] next;1.next[0]=0;2.计算next[i]:    从j=next[i-1]开始,可以得到m[i-1]的next值,辣么如果,m[i]=m[j],说明next[i]=next[i-1]+1(就是多匹配上了一个)    如果m[i]!=m[j],辣么我们需要去看比j短1的字符串是否匹配上,就是j=next[j-1],知道找到一个m[i]=m[j]或者是匹配到0.3.输出next有了next数组,KMP的匹配和计算next数组就惊人的相似了,其实也是一个东西,是不是很神奇~~~就酱!

Code

public class MyKMP {    public int kmp(String s, String m) {        int[] next = kmp(m);        int j = 0;        for (int i = 0; i < s.length(); i++) {            while (j > 0 && s.charAt(i) != m.charAt(j))                j = next[j];            if (s.charAt(i) == m.charAt(j))                j++;            if (j == m.length()) {                return i - j + 1;            }        }        return -1;    }    public int[] kmp(String m) {        int[] next = new int[m.length()];        int len = m.length();        int i, j = 0;        next[0] = 0;        for (i = 2; i < len; i++) {            while (j > 0 && m.charAt(i) != m.charAt(j)) {                j = next[j - 1];            }            if (m.charAt(i) == m.charAt(j))                j++;            next[i] = j;        }        return next;    }    public static void main(String[] args) {        String a = "0012345671234567";        String b = "1234567";        MyKMP m = new MyKMP();        System.out.print(m.kmp(a, b));    }}
0 0
原创粉丝点击