从 LeetCode_28_strStr() 到 KMP 算法

这些天一直在回顾 LeetCode 上刷过的题,当看到第 28 题实现 strStr() 时,我发现虽然它是简单题,可以使用 Java 的 indesOf() 和暴力遍历轻松的解答,但是更好也更为符合实际的应该是用 KMP 算法。关于什么是 KMP 算法,大家可以自己去 google,或者参考严蔚敏老师的《数据结构》。

这里我要分享的只是简单的实现以及其它大佬的解题思路(因为我现在对 KMP 算法理解的也不够深入)。

KMP 算法的大体思路可以参考KMP 字符串匹配算法

个人认为视频讲解比画图讲解会好一点,毕竟视频是动态的。

KMP 算法中的重难点是 next 数组的生成以及具体实现中模式串匹配。具体可以参考一下文章。珠玉在前,我就不分享自己还不够清晰完整的思路了。等我有了更为深入的理解后会来补充这一部分。

以下是我关于 LeetCode 上的第 28 道题来具体实现 KMP 算法代码

public int strStr(String haystack, String needle) {
        if(needle == null || needle.length() == 0) {
            return 0;
        }
        int[] next = new int[needle.length()];
        // 得到 next 数组
        getNextArr(next, needle);
        // 使用双指针进行匹配
        int i = 0, j = 0;
        while(i < haystack.length() && j < needle.length()) {
            if(j == -1 || haystack.charAt(i) == needle.charAt(j)) {
                i++;
                j++;
            }else {
                j = next[j];
            }
        }
        return j == needle.length() ? i - j : -1;
    }

    private void getNextArr(int[] next, String needle) {
        int k = -1;
        int j = 0;
        next[0] = -1;
        while(j < needle.length() - 1) {
            if(k == -1 || needle.charAt(j) == needle.charAt(k)) {
                k++;
                j++;
                next[j] = k;
            }else {
                k = next[k];
            }
        }
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值