Kmp算法的java实现

Kmp算法是什么

KMP算法,是由Knuth,Morris,Pratt共同提出的模式匹配算法,其对于任何模式和目标序列,都可以在线性时间内完成匹配查找,而不会发生退化,是一个非常优秀的模式匹配算法。 常规的匹配算法是当模式串的i位置目标串的j位置失配时,模式串指针i回到0位置,目标串指针回到j-i+1位置;Kmp算法无需移动目标串指针,只需移动模式串指针,该算法的核心是next数组的计算。

匹配原理图

Kmp匹配原理图
如图,当目标串与模式串在图示失配时,根据next数组令模式串指针i=3

Next数组的计算方式

Next数组的计算方式
可得到next数组
next数组

下面给出Java实现

public class Kmp {
    private static String src = null;
    private static String parten = null;
    private static int[] next;
    private static int len;

    private Kmp(String src, String parten) {
        super();

    }

    public static boolean doPartten(String src, String parten) {
        // 初始化
        Kmp.src = src;
        Kmp.parten = parten;
        len = parten.length();
        next = new int[len];
        getNext();
        // 开始匹配
        int j = 0;
        int length = src.length();
        for (int i = 0; i < length; i++) {
            while (parten.charAt(j) != src.charAt(i)) {
                j = next[j];
                if ((j == 0 && parten.charAt(j) != src.charAt(i))) {
                    j = -1;
                    break;
                }
            }
            if (++j == len) {
                return true;
            }
        }
        return false;

    }

    private static void getNext() {
        next[0] = 0;
        for (int i = 1; i < len; i++) {
            for (int j = i - 1; j > 0; j--) {
                String s1 = parten.substring(0, j - 1);
                String s2 = parten.substring(i - j + 1, i);
                if (s1.equals(s2) && j > next[i]) {
                    next[i] = j - 1;
                }
            }
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值