KMP算法

KMP算法是一种改进的字符串模式匹配算法,当匹配失败时,模式串B不会回退到0位置,而是找到合适的位置继续匹配。算法的核心是确定合适的回退位置,其时间复杂度为O(n + m),空间复杂度为O(m)。文中还包含KMP算法的代码实现和牛客网NC149例题分析。
摘要由CSDN通过智能技术生成

KMP模式匹配算法

推导

KMP是一种字符串模式匹配的改进算法。假定模式串为B,主串为A,当B[j]和A[i]不匹配时,i不会回退,j并不会从位置0开始重新匹配,而是回退到合适的位置。那么,KMP算法首先应该解决的就是如何找到合适的回退位置。
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

代码

显然时间复杂度为O(n + m), 空间复杂度为O(m),n是文本串的长度,m是模板串的长度

    /**
     * kmp算法
     *
     * 计算模板串S在文本串T中出现了多少次
     * @param S string字符串 模板串
     * @param T string字符串 文本串
     * @return int整型
     */
    public int kmp (String S, String T) {
        // write code here
        char[] sChars = S.toCharArray();
        char[] tChars = T.toCharArray();
        int i = 0, j = 0;
        int sLen = sChars.length, tLen = tChars.length;
        int res = 0;

        int[] next = getNext(sChars);

        while (j < sLen && i < tLen) {
            if (j == -1 || sChars[j] == tChars[i]) {
                ++i; ++j;
                if (j >= sLen) {
                    j = next[j];
                    res++;
                }
            } else
                j = next[j];

        }

        return res;
    }

    /**
     * 获取KMP的next数组
     * @param s
     * @return
     */
    private int[] getNext(char[] s) {
        int len = s.length;
        int[] next = new int[len + 1];
        next[0] = -1;   // 表示右移被匹配字符串(文本串)的指针

        int i = 0, j = -1;
        while (i < len) {
            if (j == -1 || s[i] == s[j]){
                ++i;
                ++j;
                if (i < len && j < len && s[i] == s[j])
                    next[i] = next[j];
                else
                    next[i] = j;
            }
            else
                j = next[j];
        }

        return next;
    }

例题

牛客NC149

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值