KMP算法

什么是KMP算法?解决字符串匹配的效率问题。
https://www.youtube.com/watch?v=GTJr8OvyEVQ

public class SubstringSearch {
    //重点在这个方法这里,每次pattern匹配到第j个字符的时候发现无法匹配,不会直接跳转到index = 0的字符,而是和它有相同前缀的字符那边,具体可以看上面视频,这个讲的不错。思考一下传统的字符串匹配算法如何实现?O(m*n),如何改进?是否有重复问题,
    private int[] computeTemporaryArray(char pattern[]) {
        int[] lps = new int[pattern.length];

        int j = 0;
        int i = 1;
        while (i < pattern.length) {
            if(pattern[i] == pattern[j]) {
                lps[i] = j + 1;
                i++;
                j++;
            }
            else {
                if( j != 0) {
                    j = lps[j - 1];
                }
                else {
                    lps[i] = 0;
                    i++;
                }
            }
        }

        return lps;
    }

    public boolean KMP(char[] text, char[] pattern) {
        int[] lps = computeTemporaryArray(pattern);

        int i = 0;
        int j = 0;

        while (i < text.length && j < pattern.length) {
            if(text[i] == pattern[j]) {
                i++;
                j++;
            }
            else {
                if(j != 0) {
                    j = lps[j-1];
                }
                else {
                    i++;
                }
            }
        }

        if(j == pattern.length)
            return true;

        return false;
    }

    public static void main(String[] args) {
        String str = "abcxabcdabcdabcy";
        String subString = "abcdabcy";
        SubstringSearch ss = new SubstringSearch();
        boolean result = ss.KMP(str.toCharArray(), subString.toCharArray());
        System.out.print(result);
    }
}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值