美文网首页
大学被虐了很久的kmp算法

大学被虐了很久的kmp算法

作者: RiceCake1122 | 来源:发表于2020-05-08 20:15 被阅读0次

    关键在于实现最长公共前后缀table。一个字符串的最长公共前后缀举例:比如"abcdabc"的最长公共前后缀为“abc”, "aaaa"的最长公共前后缀为“aaa”(不包括自己)。

    private boolean kmp(String target, String pattern) {
            int m = target.length(), n = pattern.length();
            int i = 0, j = 0;
            int[] prefixTable = getPrefixTable(pattern);
            while (i < m && j < n) {
                if (target.charAt(i) == pattern.charAt(j)) {
                    i++;
                    j++;
                } else if (j == 0) {
                    i++;
                } else {
                    j = prefixTable[j-1];
                }
            }
            return j == n;
        }
    
        private int[] getPrefixTable(String pattern) {
            int n = pattern.length();
            int[] prefix = new int[n];
            prefix[0] = 0;
            for (int i=1; i<n; i++) {
                int len = prefix[i-1];
                while (pattern.charAt(len) != pattern.charAt(i)) {
                    if (len == 0) {
                        len--; break;
                    }
                    len = prefix[len-1];
                }
                prefix[i] = len + 1;
            }
            return prefix;
        }
    

    相关文章

      网友评论

          本文标题:大学被虐了很久的kmp算法

          本文链接:https://www.haomeiwen.com/subject/drmqnhtx.html