当前位置: 首页 > news >正文

CSP信奥赛新增的算法-马拉车算法(Manacher‘s Algorithm)

适合小学六年级的同学理解马拉车算法(Manacher’s Algorithm),我们会用有趣的故事和简单代码来解释。

一、故事理解:用镜子找宝藏 🔍

假设我们要在字符串中找到最长的回文(正反读都一样的字符串),比如在字符串 S = "abba" 中找最长回文:

  1. 插入分隔符:把字符串变成 T = "#a#b#b#a#"

    • 作用:统一奇偶长度的回文查找
    • 就像在字符之间放镜子,方便反射观察
  2. 维护三个法宝

    • C:当前回文的中心(像灯塔)
    • R:已知回文的最右边界(像地图边界)
    • P[i]:每个位置的回文半径(记录每个点的能量)
  3. 镜面反射技巧

    • 当探测新位置i时,用C的镜像位置mirror = 2*C - i直接复制半径
    • 像用镜子快速复制已知信息,避免重复计算

二、C++代码实现 🖥️

#include <iostream>
#include <vector>
using namespace std;string longestPalindrome(string s) {if (s.empty()) return "";// 1. 插入分隔符(变成奇数长度)string T = "#";for (char c : s) {T += c;T += '#';}int n = T.size();vector<int> P(n, 0); // 每个中心的回文半径int C = 0, R = 0;    // 当前中心和右边界int maxLen = 0, center = 0;for (int i = 0; i < n; i++) {// 2. 找镜像位置,快速获得初始半径int mirror = 2 * C - i;if (i < R) {P[i] = min(R - i, P[mirror]);}// 3. 中心扩展int left = i - (P[i] + 1);int right = i + (P[i] + 1);while (left >= 0 && right < n && T[left] == T[right]) {P[i]++;left--;right++;}// 4. 更新中心和边界if (i + P[i] > R) {C = i;R = i + P[i];}// 5. 记录最大值if (P[i] > maxLen) {maxLen = P[i];center = i;}}// 转换回原字符串位置int start = (center - maxLen) / 2;return s.substr(start, maxLen);
}int main() {string s = "abba";cout << "最长回文子串:" << longestPalindrome(s) << endl;return 0;
}

三、关键步骤图解 🎨

以输入 "abba" 为例:

步骤操作T字符串P数组变化
1插入分隔符#a#b#b#a#初始化全0
2i=1时中心扩展找到半径1P[1]=1
3i=4时发现最长回文半径4(实际长度4)P[4]=4
4转换回原字符串abba最终结果

四、复杂度分析 ⚡

  • 时间复杂度:O(n) → 比暴力法O(n²)快得多
  • 空间复杂度:O(n) → 存储每个位置的半径

关键技巧:通过镜像反射避免重复计算,像用镜子复制已知信息!

http://www.xdnf.cn/news/442297.html

相关文章:

  • 使用 Semantic Kernel 调用 Qwen-VL 多模态模型
  • YashanDB V23.4 LTS 正式发布|两地三中心、库级闪回重磅特性上线,生产级可用性再升级
  • docker(二)初识 docker
  • Rust入门之高级Trait
  • 机器学习 Day17 朴素贝叶斯算法-----概率论知识
  • 2025视频协作工具全景解析:技术跃迁与场景重构
  • 【Linux网络】认识网络
  • 编译openssl源码
  • 【软件工程】基于数据流和依赖分析
  • 商城小程序源码介绍
  • OpenHarmony系统HDF驱动开发介绍(补充)
  • react+html2canvas+jspdf将页面导出pdf
  • 673SJBH基于ASP的公交系统
  • 鸿蒙OSUniApp 实现图片上传与压缩功能#三方框架 #Uniapp
  • SpringAI更新:废弃tools方法、正式支持DeepSeek!
  • 【springcloud学习(dalston.sr1)】Eureka 客户端服务注册(含源代码)(四)
  • 【行为型之中介者模式】游戏开发实战——Unity复杂系统协调与通信架构的核心秘诀
  • 3337. 字符串转换后的长度 II
  • 【更新】全国省市县-公开手机基站数据集(2006-2025.3)
  • NVMe简介2
  • UniApp 微信小程序绑定动态样式 :style 避坑指南
  • 电脑开机提示按f1原因分析及解决方法(6种解决方法)
  • Baklib内容中台AI革新智能服务实践
  • 【评测】免费体验dify工作流模式下腾讯语音转文字speech2text服务
  • 软件逆向基础-CE篇
  • 剖析提示词工程中的递归提示
  • 安全合规检查开源项目ComplianceAsCode/content详解及操作系统新产品开发适配指南
  • upload-labs通关笔记-第5关 文件上传之.ini绕过
  • 探索AI新领域:生成式人工智能认证(GAI认证)助力职场发展
  • 全流量解析:让安全防御从“被动挨打”升级为“主动狩猎”