KMP算法 - NOTE

KMP算法 - NOTE

KMP算法:子串匹配算法
这个算法我查阅了很多资料都啃不下来,最终在一个B站的UP主的视频里面找到了感觉,大家有兴趣可以去看一下那个视频(仅是原理讲解):天勤公开课」KMP算法易懂版

本渣渣看完视频后自己写了一个我觉得比较好理解的代码欢迎大家指正:

public class KMP {
    public static void main(String[] args) {
        String str = "asdsdsaadsds";	//待查询串
        String sonStr = "dsd";		//子串
        int[] next = nextArr(sonStr);		//构建子串对应的next数组
        int j = 0;
        for(int i = 0; i < str.length(); i++){
           /**
            * 字符匹配
            * 如果相等则一直检验下去,直到j等于子串的长度的时候,证明匹配成功
            * 否则,子串回溯到当前位置前 最大相同子串+1 处,即next数组对应的值,继续匹配
            */
            if(str.charAt(i) == sonStr.charAt(j)){
                j++;
            }else{
                j = next[j + 1];
            }
            //j等于子串长度,匹配成功,返回成功匹配子串的首索引位置
            if(j == sonStr.length()){
                System.out.println("匹配成功,首地址为: " + (i + 1 -sonStr.length()));
                return;
            }
        }
        System.out.println("匹配失败");

    }
	//构建next数组
    private static int[] nextArr(String sonStr) {
        int length = sonStr.length();
        int[] next = new int[length + 1];
        next[0] = 0;
        for (int i = 1; i <= length; i++) {
            next[i] = maxSubString(sonStr, i);
        }
        return next;
    }
	//子串当前索引前的最大相同子串长度
    private static int maxSubString(String sonStr, int index) {
        int max = 0;
        if (index > 1) {
        	//不能大于index-1,否则将没有意义
            for (int k = 0; k < index-1; k++) {
                if (sonStr.substring(0, k).equals(sonStr.substring(index - k - 1, index - 1))) {
                    max = k + 1;
                }
            }
        }
        return max;
    }
}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值