news 2026/4/16 13:25:22

匹配回文串:利用KMP算法求解

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
匹配回文串:利用KMP算法求解

一、先明确问题:什么是 “回文串”?

回文串定义:回文串是指正读和反读都完全相同的字符串

比如 “abcba”“aaa”“level” 都是回文串,而 “abcd”“abbaa” 不是。可以简单理解为:字符串从左到右读,和从右到左读,得到的结果完全一致。

二、了解算法:什么是KMP算法?

KMP 算法是一种高效的字符串匹配算法,全称为 Knuth-Morris-Pratt 算法,核心作用是在主串中快速找到模式串的出现位置,时间复杂度优化到了线性(O(n+m),n是主串长度,m是模式串长度),比暴力匹配的O(n*m)高效得多。

KMP 的核心是利用 “模式串自身的前后缀信息”,避免不必要的回退——匹配失败时,主串指针不回退,只调整模式串指针的位置。

KMP 的执行流程

以 “主串S = "ABCABCABD",模式串P = "ABCABD"” 为例:

  1. 预处理模式串:计算P的前缀函数数组prefix

    • P = A B C A B D
    • prefix = [0,0,0,1,2,0](比如P[4]对应的子串"ABCAB",最长相等前后缀是"AB",长度 2)。
  2. 匹配主串和模式串

    • 用两个指针i(主串)、j(模式串)遍历:
      • S[i] == P[j]i++j++;即当前字符匹配成功,两个指针一起往后挪,继续检查下一个字符
      • 若不相等:j = prefix[j-1](利用前缀函数回退模式串指针,主串i不回退);
      • j == 模式串长度:匹配成功,返回i-j(模式串在主串中的起始位置)。
  3. 具体解析一下

步骤 1:S [0] == P [0](A == A)

  • 匹配成功 → i++(i=1),j++(j=1)

  • 当前状态:i=1,j=1

步骤 2:S [1] == P [1](B == B)

  • 匹配成功 → i++(i=2),j++(j=2)

  • 当前状态:i=2,j=2

.............

步骤 6:S [5] != P [5](C != D)

  • 匹配失败!按规则:j = prefix [j-1](j 现在是 5,j-1=4,prefix [4] = 2)
  • 所以 j 回退到 2,i 保持 5 不变(主串不回退)
  • 当前状态:i=5,j=2

注:为什么回退到 j=2?

当步骤 5 后 j=5(P [5] = D),S [5] = C,匹配失败时:

  • j-1 = 4 → prefix [4] = 2 → 意味着 P [0..4]("ABCAB")的最长相等前后缀是 "AB"(长度 2)
  • 所以不用让 j 回退到 0,而是直接回退到 2(前缀 "AB" 的末尾),相当于复用了之前匹配成功的 "AB",直接检查 P [2](C)和 S [5](C)即可

再通俗一点来讲,就是S [5] != P [5](C != D)意味着第六个字母主串和子串不同,但是前面的我们都是相同的,既然现在不同了,我们就要回退回去(子串)再比较,那么退到哪里呢?我们就找子串的前缀和后缀最长相等的地方,主串的指针指的是ABCABCABD,子串的指针就要ABCABD退到C来和主串再比较。

步骤 7:S [5] == P [2](C == C)

  • 现在检查 S [5](C)和 P [2](C)→ 匹配成功
  • 执行 i++(i=6),j++(j=3)
  • 当前状态:i=6,j=3

步骤 8:S [6] == P [3](A == A)

  • 匹配成功 → i++(i=7),j++(j=4)
  • 当前状态:i=7,j=4

.............

终止条件:j == 6(模式串长度)

  • 匹配成功!返回「模式串在主串中的起始位置」= i - j = 9 - 6 = 3
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/4/16 11:01:19

NCM文件转换神器:NCMconverter完全使用指南

NCM文件转换神器:NCMconverter完全使用指南 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter 还在为网易云音乐下载的ncm格式文件无法播放而烦恼吗?NCMconv…

作者头像 李华
网站建设 2026/4/16 8:24:41

百度网盘极速下载终极指南:3步实现高速下载体验

百度网盘极速下载终极指南:3步实现高速下载体验 【免费下载链接】baidu-wangpan-parse 获取百度网盘分享文件的下载地址 项目地址: https://gitcode.com/gh_mirrors/ba/baidu-wangpan-parse 百度网盘作为国内广泛使用的云存储服务,其下载速度限制…

作者头像 李华
网站建设 2026/4/16 11:03:14

如何快速免费转换NCM文件:NCMconverter完整使用教程

如何快速免费转换NCM文件:NCMconverter完整使用教程 【免费下载链接】NCMconverter NCMconverter将ncm文件转换为mp3或者flac文件 项目地址: https://gitcode.com/gh_mirrors/nc/NCMconverter NCMconverter是一款专为解决网易云音乐下载的ncm格式文件转换问题…

作者头像 李华
网站建设 2026/4/16 10:58:17

DPDK KNI 模块:高性能网络数据平面的内核交互桥梁

有了KNI模块,DPDK应用程序就可以实现:选择性处理: DPDK专注处理关注的高性能数据路径流量,把自己不想要的协议、控制平面流量或要内核处理的包转发给内核协议栈。直接用内核已有的网络功能,不用在用户空间重新实现这些…

作者头像 李华
网站建设 2026/4/15 10:01:56

C语言实现幂级数(附带源码)

一、项目背景详细介绍幂级数(Power Series)是数学分析中一种极为重要的函数表达方式,通过将函数展开为一系列以某点为中心的无限项多项式,可以用来近似计算、求导、积分、解析表达、数值计算等。大量经典函数,如指数函…

作者头像 李华