c++ 获取字符串中最长的回文子串
#include <vector>
#include <iostream>
#include <string>
using namespace std;
string Manacher(string s) { // 插入特殊符号“#”
string t = "$#";
for (int i = ; i < s.size(); ++i) {
t += s[i];
t += "#";
} // 初始化变量
vector<int> p(t.size(), );
int mx = , id = , resLen = , resCenter = ; //循环t.size()-1次
for (int i = ; i < t.size(); ++i) { // p[i]:表示以 t[i] 字符为中心的回文子串的半径
// i < mx 的含义:证明 i 在 当前id 对应子回文串的范围之内
p[i] = i<mx ? min(p[ * id - i], mx - i) : ; //从字符串中点向两端扩展,直到不能再扩展
while (t[i + p[i]] == t[i - p[i]]){
++p[i];
} //mx:当前已经处理的回文子串所达最靠后的终点
//id:终点最靠后的回文子串的中心字符下标
if (mx < i + p[i]) {
mx = i + p[i];
id = i;
} //结果
//回文字符串最大长度reslen
//回文字符串的中心位置resCenter
if (resLen < p[i]) {
resLen = p[i];
resCenter = i;
}
} //例子: "noon",中间的 '#' 在字符串 "$#n#o#o#n#" 中的位置是5,半径也是5,
//字符串的长度(半径减一):4,起始位置(中间位置减去半径再除以2):0 //结论:最长子串的长度是半径resLen减1,起始位置是中间位置resCenter减去半径resLen再除以2。
return s.substr((resCenter - resLen) / , resLen - );
} //主程序
int main() {
string s = "aawaw";
cout << Manacher(s) << endl;
}
参考:
https://www.jianshu.com/p/c82cada7e5b0
https://www.cnblogs.com/grandyang/p/4475985.html
https://www.jianshu.com/p/7dacc9a3c9a0
c++ 获取字符串中最长的回文子串的更多相关文章
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- Longest Palindromic Substring - 字符串中最长的回文字段
需求:Given a string S, find the longest palindromic substring in S. You may assume that the maximum le ...
- leetcode 5 查找最长的回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
- manacher算法处理最长的回文子串(一)
引言 相信大家都玩过折叠纸张,如果把回文串相当于折叠一个A4纸,比如ABCDDCBA就是沿着中轴线(D与D之间)对折重合,那么这个就是一个回文串.或者是ABCDEDCBA的中轴线就是E,那么沿着中轴线 ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- bzoj2565 最长双回文子串
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
- manacher算法处理最长的回文子串(二)
在上篇<manacher算法处理最长的回文子串(一)>解释了manacher算法的原理,接着给该算法,该程序在leetcode的最长回文子串中通过.首先manacher算法维护3个变量.一 ...
- LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目: Given a , and there exists one unique longest palindromic substring. 解题思路:1.简单思路:暴力破解法,时间复杂度O(n^ ...
随机推荐
- 2019 巨人网络java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.巨人网络等公司offer,岗位是Java后端开发,最终选择去了巨人网络. 面试了很多家公司,感觉大部分公司考察的点 ...
- JAVA字符串比较,BigDecimal比较
import java.math.BigDecimal; public class StrCompareTo { public static void main(String[] args) { Sy ...
- aria2 ssl
https://github.com/q3aql/aria2-static-builds https://github.com/aria2/aria2/issues/781
- 【转载】C#使用ToList()将数组快速转换为List集合
在C#的编程中,数组和List集合是比较常用的两个集合类,有时候因为业务需要,需要将数组集合转换为List集合,此时就可以使用C#中的Linq的扩展方法ToList方法来实现,只需要简单的一条语句即可 ...
- JavaScript insertAdjacentHTML()的使用
含义: insertAdjacentHTML() 将指定的文本解析为HTML或XML,并将结果节点插入到DOM树中的指定位置.它不会重新解析它正在使用的元素,因此它不会破坏元素内的现有元素.这避免了额 ...
- javascript中attribute和property的区别详解
DOM元素的attribute和property很容易混倄在一起,分不清楚,两者是不同的东西,但是两者又联系紧密.很多新手朋友,也包括以前的我,经常会搞不清楚. attribute翻译成中文术语为“特 ...
- webpack练手项目之easySlide(二):代码分割
Hello,大家好. 在上一篇 webpack练手项目之easySlide(一):初探webpack 中我们一起为大家介绍了webpack的基本用法,使用webpack对前端代码进行模块化打包. 但 ...
- 小程序中的数据请求sessionid,保持登陆状态。
版权声明:本文为CSDN博主「weixin_43964779」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明.原文链接:https://blog.csdn.net ...
- Centos7安装DockerCE
1. 说明 以下使用的系统为centos7,64位,镜像为CentOS-7-x86_64-Minimal-1804,所有操作以root用户操作 2. 安装Docker官方源 2.1 安装yum工具集 ...
- Linux操作系统之grub加密实战案例
Linux操作系统之grub加密实战案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.为grub设置明文密码案例 1>.修改"/boot/grub/grub. ...