Manacher算法学习笔记

DECLARATION

引用来源:https://www.cnblogs.com/grandyang/p/4475985.html

CONTENT

用途:寻找一个字符串的最长回文子串
时间复杂度:O(N)
算法步骤
1.添加特殊字符

由于回文串的长度可奇可偶,比如"bob"是奇数形式的回文,"noon"就是偶数形式的回文,马拉车算法的第一步是预处理,做法是在每一个字符的左右都加上一个特殊字符,比如加上'#',那么

bob --> #b#o#b#

noon --> #n#o#o#n#

这样做的好处是不论原字符串是奇数还是偶数个,处理之后得到的字符串的个数都是奇数个,这样就不用分情况讨论了,而可以一起搞定。

2.求每个回文子串的半径

我们还需要和处理后的字符串t等长的数组p,其中p[i]表示以t[i]字符为中心的回文子串的半径,若p[i] = 1,则该回文子串就是t[i]本身。

最长子串的长度是半径减1,起始位置是中间位置减去半径再除以2。

如何求p数组,需要新增两个辅助变量mxid,其中id为能延伸到最右端的位置的那个回文子串的中心点位置,mx是回文串能延伸到的最右端的位置,这个算法的最核心的一行如下:
p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;

代码实现
Leetcode #5

class Solution {
public:string longestPalindrome(string s) {// Insert '#'string t = "$#";for (int i = 0; i < s.size(); ++i) {t += s[i];t += "#";}// Process tvector<int> p(t.size(), 0);int mx = 0, id = 0, resLen = 0, resCenter = 0;for (int i = 1; i < t.size(); ++i) {p[i] = mx > i ? min(p[2 * id - i], mx - i) : 1;while (t[i + p[i]] == t[i - p[i]]) ++p[i];if (mx < i + p[i]) { //update mx & idmx = i + p[i];id = i;}if (resLen < p[i]) { //update resLen & resCenterresLen = p[i];resCenter = i;}}return s.substr((resCenter - resLen) / 2, resLen - 1);}
};

转载于:https://www.cnblogs.com/NeilThang/p/10105874.html

Manacher算法学习笔记 | LeetCode#5相关推荐

  1. 数据结构与算法 学习笔记(5):字符串

    数据结构与算法 学习笔记(5)- 字符串 本次笔记记录了LeetCode中关于字符串的一些问题,并给出了相应的思路说明和代码.题目编号与LeetCode对应,方便查找. 题目1:LeetCode 13 ...

  2. 数据结构与算法 学习笔记(8):字典、集合、哈希表

    数据结构与算法 学习笔记(8):字典.集合.哈希表 本次文章记录的是和字典.集合.哈希表等数据结构相关的LeetCode算法题(题号与LeetCode对应),包括其构造和使用,针对每一题或一类题给出了 ...

  3. 大顶堆删除最大值_算法学习笔记(47): 二叉堆

    堆(Heap)是一类数据结构,它们拥有树状结构,且能够保证父节点比子节点大(或小).当根节点保存堆中最大值时,称为大根堆:反之,则称为小根堆. 二叉堆(Binary Heap)是最简单.常用的堆,是一 ...

  4. 数据结构与算法学习笔记之 从0编号的数组

    数据结构与算法学习笔记之 从0编号的数组 前言 数组看似简单,但掌握精髓的却没有多少:他既是编程语言中的数据类型,又是最基础的数据结构: 一个小问题: 为什么数据要从0开始编号,而不是 从1开始呢? ...

  5. 输出dag的所有拓扑排序序列_算法学习笔记(53): 拓扑排序

    拓扑排序是对DAG(有向无环图)上的节点进行排序,使得对于每一条有向边 , 都在 之前出现.简单地说,是在不破坏节点 先后顺序的前提下,把DAG拉成一条链.如果以游戏中的科技树(虽然名字带树,其实常常 ...

  6. 算法学习笔记:对指定金额计算最少钞票数

    算法学习笔记:对指定金额计算最少钞票数 一.引出问题 财务人员给员工发工资时经常遇到这样一个问题,即根据每个人的工资额(以元作为单位)计算出各种面值的钞票的张数,且要求总张数最少.例如,某职工工资为3 ...

  7. matlab中x从0到5不含0,关于MATLAB的数学建模算法学习笔记

    关于MATLAB的数学建模算法学习笔记 目录 线性规划中应用: (3) 非线性规划: (3) 指派问题;投资问题:(0-1问题) (3) 1)应用fmincon命令语句 (3) 2)应用指令函数:bi ...

  8. 机器学习篇01:在线学习的支持向量机算法学习笔记

    在线学习的支持向量机算法学习笔记 oisvm算法实现说明 oisvm算法实现说明 % 本程序是用于实现基于在线学习的调制信号识别的程序 % % % 第一步:调制信号的生成 % 首先是7个信号:2ASK ...

  9. 数据结构与算法学习笔记之 提高读取性能的链表(上)

    数据结构与算法学习笔记之 提高读取性能的链表(上) 前言 链表(Linked list)比数组稍微复杂一点,在我们生活中用到最常见的应该是缓存,它是一种提高数据读取性能的技术,常见的如cpu缓存,浏览 ...

最新文章

  1. Java项目:企业员工绩效工资管理系统(java+SpringBoot+FreeMarker+Mysql)
  2. SQLServer查看存储过程的方法
  3. java有一个东西_Java编写中容易搞错的一些东西
  4. Python 技术篇-用paramiko库实现linux服务器文件下载到winodws本地实例演示
  5. 删除归档日志_ORA-00257:archiver error.Connect internal only, until freed的问题
  6. 【Matlab】山地建模?立体热度?怎么绘制三维曲面图?
  7. spring boot 整合redis实现session共享
  8. VBA实战技巧精粹011:新建只有1张工作表的工作簿
  9. python env_#!/usr/bin/env python 有什么用?
  10. c语言上机题库程序设计,C语言上机程序设计题库及答案.docx
  11. 数据结构(五)堆排序
  12. 浅谈Spark几种不同的任务提交相关脚本(以Spark 1.5.0为例)
  13. 前端js-angluar定时刷新器
  14. python文本自动伪原创_手把手教你使用python制作伪原创工具
  15. 八皇后问题python_八皇后问题 Python实现
  16. STM32CubeMX:中断函数例题:2021-08-03
  17. 色粉笔画的简史和怎样画色粉笔画?
  18. 【CXY】JAVA基础 之 GUI
  19. 松下Megacon叠屏液晶电视有声音没图像怎么修理
  20. 5 种值得收藏的图像压缩器工具,可不降低质量压缩图像

热门文章

  1. [机器学习] XGBoost on Spark 分布式使用完全手册
  2. 【个人网盘-updog】使用updog建立个人网盘,so easy
  3. python 如何将代码中的输入保存到txt里边
  4. TensorFlow调试常见问题(pycharm)
  5. raspberry pi_在Raspberry Pi上使用TensorFlow进行对象检测
  6. 北京某打工子弟学校之一
  7. 徐坤用话剧震了我们一道
  8. 一个弱智问题, Ubuntu 中gedit 菜单栏在哪里?
  9. 64位Ubuntu kylin 16.04使用fastboot下载内核到tiny4412开发板
  10. pcm 采样率转换_All Video Converter Pro for mac(音视频格式转换器)