菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
432
0

【字符串匹配】KMP算法

原创
05/13 14:22
阅读数 87204

目录

1.KMP的名词解释

2.KMP运行原理

3.KMP的代码


 1.KMP的名词解释

KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。

具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)。

2.KMP运行原理

next数组怎么求?
对模式串p求next数组,next数组的值为模式串p的该位置失配,下一步j从哪个位置回溯。

理解:若j位置失配,则在p[0,j-1]中查找前缀,后缀中最长匹配距离。

如何使用代码实现?

主要是找到失配位置j的最长匹配前缀在哪里

使得next[j]=k k为j下次应该回溯的位置,
比较p[j]、p[k],如果两字符相等 k++;j++;

如果不等j回溯到k,直到k<0

3.KMP的代码

public class ccase12_KMP {
    public static void main(String[] args) {
        String s = "babababcbabababb";
        // String p="bababb";
        String p = "bab";
        System.out.println(work(s, p));

    }

    /**
     * 求出现模式串的次数
     * 
     * @param s
     * @param p
     */
    private static int work(String s, String p) {
        int len1 = s.length();
        int len2 = p.length();
        int i = 0, j = 0;
        int count = 0;
        int[] next = next(p);
        // 异常处理
        if (len1 < len2)
            return -1;
        if (len1 == 0 || len2 == 0)
            return -1;

        while (i < len1) {
            if (j == -1 || s.charAt(i) == p.charAt(j)) {
                i++;
                j++;
            } else {// 失配
                j = next[j];
            }
            if (j == len2) {
                count++;
                i--;
                j = next[j];
                // return (i-j);
            }

        }
        return count;
    }

    public static int[] next(String p1) {
        int[] next = new int[p1.length() + 1];
        char[] p = p1.toCharArray();
        next[0] = -1;
        if (p1.length() == 1)
            return next;
        next[1] = 0;
        int j = 1;
        int k = next[j];
        while (j < p1.length()) {
            if (k < 0 || p[j] == p[k]) {
                next[++j] = ++k;
            } else {
                k = next[k];
            }
        }

        return next;
    }

}
KMP

 

发表评论

0/200
432 点赞
0 评论
收藏
为你推荐 换一批