news 2026/9/2 16:48:38

匹配回文串:利用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/9/3 0:25:56

腾讯AngelSlim开源项目深度解析:AI驱动的开发者协作新范式

在当今数字化浪潮席卷全球的背景下,开源社区已成为推动技术创新的核心引擎。腾讯作为全球领先的互联网科技公司,始终积极投身开源事业,近日其在Gitcode平台上发布的AngelSlim项目引发了业界广泛关注。该项目以222星标和26次分支 Fork 的成绩&…

作者头像 李华
网站建设 2026/9/2 22:27:28

Linux基础命令和工具详解,让你轻松应对各种任务!

grep 命令用于在文件中执行关键词搜索,并显示匹配的效果。部分常用选项 :-c 仅显示找到的行数-i 忽略大小写-n 显示行号-v 反向选择 – 仅列出没有关键词的行。v 是 invert 的缩写。-r 递归搜索文件目录-C n 打印匹配行的前后n行(1&#xff0…

作者头像 李华
网站建设 2026/9/2 10:39:52

DPDK技术详解:工作原理与环境搭建实践指南

网卡作为 ssh 连接的网卡。(2)修改网卡配置信息。找到虚拟机安装目录下的.vmx文件,内容如下:展开代码语言:Bash自动换行AI代码解释.encoding "GBK" config.version "8" virtualHW.version &quo…

作者头像 李华
网站建设 2026/9/2 11:27:41

JavaScript学习

为什么学习 JavaScript?JavaScript 不仅是 Web 开发的三大核心技术之一,更是全栈开发的通行证。根据 Stack Overflow 2023 开发者调查,JavaScript 连续 11 年位居最流行编程语言榜首,市场需求巨大。JavaScript 学习路径基础语法与…

作者头像 李华
网站建设 2026/9/2 11:19:14

5个秘诀让你的Windows右键菜单秒响应:终极解决方案揭秘

5个秘诀让你的Windows右键菜单秒响应:终极解决方案揭秘 【免费下载链接】ContextMenuManager 🖱️ 纯粹的Windows右键菜单管理程序 项目地址: https://gitcode.com/gh_mirrors/co/ContextMenuManager "每次右键都要等上好几秒,那…

作者头像 李华