news 2026/8/23 8:23: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/8/22 18:35:19

终极指南:5步实现B站视频高效批量下载与高清保存

终极指南:5步实现B站视频高效批量下载与高清保存 【免费下载链接】downkyi 哔哩下载姬downkyi,哔哩哔哩网站视频下载工具,支持批量下载,支持8K、HDR、杜比视界,提供工具箱(音视频提取、去水印等&#xff09…

作者头像 李华
网站建设 2026/8/21 13:20:58

2024年8月中文大模型战力榜:国产模型全面崛起改写全球竞争格局

一、行业背景与研究意义 【免费下载链接】DeepSeek-V2-Chat-0628 DeepSeek-V2-Chat-0628,开源创新之作,AI聊天机器人性能卓越,编码能力出众。在LMSYS Chatbot Arena榜单脱颖而出,多项任务表现领先。升级优化,体验更佳&…

作者头像 李华
网站建设 2026/8/21 16:40:20

LeetCode热题100--215. 数组中的第K个最大元素--中等

题目 给定整数数组 nums 和整数 k,请返回数组中第 k 个最大的元素。 请注意,你需要找的是数组排序后的第 k 个最大的元素,而不是第 k 个不同的元素。 你必须设计并实现时间复杂度为 O(n) 的算法解决此问题。 示例 1: 输入: [3,2,1,5,6,4]…

作者头像 李华
网站建设 2026/8/21 11:07:27

C语言递归函数的习题笔记

字符串逆序的递归实现(C语言)在C语言中,实现字符串逆序的递归方法是一种高效且直观的方式。递归的核心思想是将问题分解为更小的子问题:通过交换字符串的首尾字符,然后递归地处理剩余的子字符串,直到整个字…

作者头像 李华
网站建设 2026/8/22 8:21:38

Flutter 通用弹窗组件 CustomDialogWidget:全自定义布局 + 多场景适配

在 Flutter 开发中,弹窗是交互反馈、信息确认、选项选择的核心载体。原生 showDialog 存在样式固化、布局灵活度低、多按钮适配差等问题,重复开发易导致 APP 内弹窗风格混乱。本文封装的 CustomDialogWidget 整合 “头部 内容 按钮区” 全自定义、单选…

作者头像 李华
网站建设 2026/8/23 8:20:03

Flutter 通用列表项组件 CommonListItemWidget:全场景布局 + 交互增强

在 Flutter 开发中,列表是数据展示的核心载体,而列表项的样式统一性与灵活性直接影响开发效率与用户体验。原生 ListTile 存在图标位置固定、不支持徽章提示、自定义布局受限等问题。本文封装的 CommonListItemWidget 整合 “图标 / 图片 标题 副标题 …

作者头像 李华