Java算法之KMP算法、字符串匹配、思路分析、代码实现


KMP算法

KMP算法解决模式串在文本串中是否出现过。如果出现过,返回最早出现的索引位置。

KMP算法命名,是由3个人的姓氏命名,由D.E.Knuth,J.H.Morris和V.R.Pratt在1997年提出的。

KMP算法的核心是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是通过一个next()函数实现,函数本身包含了模式串的局部匹配信息。KMP算法的时间复杂度O(m+n)

详尽KMP算法


. 思路分析

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

这是因为需要回溯到j位置的上一个字符j-1索引对应的匹配值数组索引的值作为j下一次索引的位置

Kmp算法,减少了很多不必要的匹配。


. 代码实现

public class KMP {
    public static void main(String[] args) {
        String str01 = "ABCAAB CAB DAABCAB";
        String str02 = "ABCAB";
        int index = kmpAlgo(str01, str02);
        System.out.println(index);
    }

    public static int[] getNextArray(String dest){
        int next[] = new int[dest.length()]; // 创建一个和数组长度一样的部分匹配值表
        next[0] = 0; // 表的第一个长度永远是0
        // i=1 开始索引的可以看成是后缀字符串
        // j=0 开始索引的可以看成事前缀字符串
        for (int i = 1, j=0; i < next.length; i++) {
            // 如果两个字符不相等,并且j大于0,那么j就需要回溯到next[j-1]的位置
            // 建议画图理解
            while (j>0 && dest.charAt(i)!=dest.charAt(j)){
                // 回溯到cartAt(j-1)字符的索引对应的next表中的值,将其作为下一个回溯的索引
                j = next[j-1];
            }
            // 如果相等,那么最大匹配值就是j++的值
            if (dest.charAt(i) == dest.charAt(j)){
                j++;
            }
            next[i] = j;
        }
        return next;
    }

    public static int kmpAlgo(String source, String target){
        int[] next = getNextArray(target);
        for (int i = 0, j=0; i < source.length(); i++) {
            while (j>0 && source.charAt(i) != target.charAt(j)){
                j = next[j-1];
            }
            if (source.charAt(i)==target.charAt(j)){
                j++;
            }
            if (j == target.length()){
                return i-j+1;
            }
        }
        return -1;
    }
}

结果:

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值