kmp算法

共 886字,需浏览 2分钟

 ·

2025-12-09 20:09

MP(Knuth-Morris-Pratt)算法是一种字符串快速匹配算法,核心思想是:

利用已经匹配过的信息,把模式串自己和自己对比,提前算出一张“跳步表”(next 数组),主串的指针永不回溯,一次扫描完成匹配。

时间复杂度:

  • 预处理 O(m)
  • 匹配 O(n)总 O(n+m),远优于暴力 O(n·m)。

一、暴力 vs KMP(直观例子)

主串 S = ababcabcacbab
模式 P = abcac

暴力做法:
每次失配就把 P 往后挪 1 位,主串指针要回溯,最坏 15×5=75 次比较。

KMP 做法:
失配时只把 P 按 next 数组右滑,主串指针不动,共 19 次比较就找到答案。

def kmp_search(s, p):

   n, m = len(s), len(p)

   nxt = build_next(p)

   j = 0               # 当前在模式串的位置

   for i in range(n):  # i 只增不减,永不回溯

       while j and s[i] != p[j]:

           j = nxt[j-1]  # 失配,按 next 滑 P

       if s[i] == p[j]:

           j += 1

       if j == m:        # 完全匹配

           return i - m + 1

   return -1

浏览 1
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报
评论
图片
表情
推荐
点赞
评论
收藏
分享

手机扫一扫分享

分享
举报