KMP字符串模式匹配算法Java实现

本文详细介绍了KMP字符串模式匹配算法,并提供了Java实现。从朴素算法的O(n*m)时间复杂度到KMP算法的O(n)时间复杂度,KMP通过next数组避免无效匹配,提高效率。文章包含next数组的求解方法和优化的KMP算法的Java代码实现。
摘要由CSDN通过智能技术生成

通过优锐课核心java学习笔记中,我们可以看到KMP字符串模式匹配算法Java实现 ,码了很多专业的相关知识, 分享给大家参考学习。

从头到尾彻底理解KMP,并着重于Java实现 😃。 现有字符串匹配算法有不少,如简单暴力的朴素算法(暴力匹配算法)、KMP算法、BM算法以及Sunday算法等,在这里仅介绍前两种算法。

  1. 朴素算法
    朴素算法即暴力匹配算法,对于长度为n的文本串S和长度为m模式串P,在文本串S中是否存在一个有效偏移i,其中 0≤ i < n - m + 1,使得 S[i… i+m - 1] = P[0 … m-1](注:下标从0开始),如果存在则匹配成功,否则匹配失败。由于在匹配过程中一旦不匹配,就要让模式串P相对于文本串S右移1,即i需要进行回溯,其时间复杂度为O(n*m)。
    Java实现:
    // 定义接口
    interface StringMatcher {
    /**
    * 从原字符串中查找模式字符串的位置,如果模式字符串存在,则返回模式字符串第一次出现的位置,否则返回-1
    *
    * @param source
    * 原字符串
    * @param pattern
    * 模式字符串
    * @return if substring exists, return the first occurrence of pattern
    * substring, return -1 if not.
    /
    int indexOf(String source, String pattern);
    }
    /
    *

    • 暴力匹配

    • 时间复杂度: O(m*n), m = pattern.length, n = source.length
      */
      class ViolentStringMatcher implements StringMatcher {

      @Override
      public int indexOf(String source, String pattern) {
      int i = 0, j = 0;
      int sLen = source.length(), pLen = pattern.length();
      char[] src = source.toCharArray();
      char[] ptn = pattern.toCharArray();
      while (i < sLen && j < pLen) {
      if (src[i] == ptn[j]) {
      // 如果当前字符匹配成功,则将两者各自增1,继续比较后面的字符
      i++;
      j++;
      } else {
      // 如果当前字符匹配不成功,则i回溯到此次匹配最开始的位置+1处,也就是i = i - j + 1
      // (因为i,j是同步增长的), j = 0;
      i = i - j + 1;
      j = 0;
      }
      }
      // 匹配成功,则返回模式字符串在原字符串中首

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值