Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.
Example 1:
Input: "babad"
Output: "bab"
Note: "aba" is also a valid answer.
Example 2:
Input: "cbbd"
Output: "bb"
题解:
这个题重新学习了Manacher算法,重新研读第一次学习的代码,真正把这个题的思路想清楚,就可以按照理解很快的把代码实现出来,比我第一次学习这个算法的时候看懂别人的代码然后把别人的模板抄下来,进步了很多。
这个题给我的启发也是,学习任何算法,思考清楚整个过程然后再自己实现它,思考的过程长一点,理解好每个细节是很重要的,只有想明白才能很快把代码写出来!以后要养成没有思考清楚就不着急下手敲题的习惯。
Manacher算法:是一个很典型的空间换时间的算法,给出我初次学习的笔记https://www.cnblogs.com/shanyr/p/5676597.html
重新梳理以下这个算法:
算法主要分为三部分:
A. 扩展原字符串:
a.为了防止遍历到起始位置的时候会出现越界的情况,在最开始添加字符“$”(我是用手动判度是否到到结尾的,如果不加这个判断我感觉也可以在结尾加一个‘$’)
b.将每个字符用未出现过的字符隔开,一般用‘#’
根据前两步,一个字符串会变成下面的形式
b a b a d
->$#b#a#b#a#d#
B. 变量定义:
a.定义p[i]表示从第i个位置可以向两边延伸的最长的位置,使得以i为中心,左右各扩展p[i]长度的子串满足回文
例如对串$#b#a#b#a#d#的p数组为
$ # b # a # b # a # d #
p -> 0 0 1 0 3 0 3 0 1 0 1 0
然后可以发现p中的最大值就是最长回文子串的长度,很容易证明。但是这个题要求输出的是子串,只要从最大值为中心,前后p[]的位置搜索,把不是'#'输出就可以。
C. 求p[i]:由于我们是O(n)的算法,所以在计算第i个位置的时候,前面的i-1个位置的p值已经算出来了。
我们可以利用之前求的对称性:定义mx为当前扫描的最远的位置,id为mx对应的中心点,可以将p[i]分成两种情况求解:
a. 情况1,如下图所示,mx-i >p[j],那么p[i]一定等于p[j]。(因为id左右mx是对称的)

b.情况2,如下图所示,mx-i <= p[j],那么mx-i的长度的部分一定是对称的,但是超出的部分就要挨个判断了,判断结束后要更新mx = i+p[i], id = i。(因为id左右mx是对称的)

给出代码:
class Solution {
public:
string longestPalindrome(string s) {
//扩展
string expend_s;
expend_s+='$';
int len = s.length();
for(int i = ; i < len; i++){
expend_s+='#';
expend_s+=s[i];
}
expend_s+='#';
//定义
int p[*expend_s.length()];
memset(p,,sizeof(p));
int mx = , id = ;
int max = , maxid = ;//保存最大回味子串搜索长度和位置
//求p
for(int i = ; i < expend_s.length(); i++){
int j = *id - i;
if(p[j]<mx-i){
p[i] = p[j];
}
else{
for(;expend_s[i+p[i]]==expend_s[i-p[i]]; p[i]++){
if(i+p[i]>=expend_s.length())break;//要判断右侧是否越界
}
mx = i+p[i];
id = i;
}
if(max < p[i]){
max = p[i];
maxid = i;
}
}
string ans;
for(int i = maxid-max+; i <= maxid+max-; i++){
if(expend_s[i]!='#'){
ans+=expend_s[i];
}
}
return ans;
}
};
Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)的更多相关文章
- 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- [LeetCode] 5. Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- [leetcode]5. Longest Palindromic Substring最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
- 【LeetCode】5. Longest Palindromic Substring 最长回文子串
作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:最长回文子串,题解,leetcode, 力扣,python ...
- LeetCode:Longest Palindromic Substring 最长回文子串
题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- lintcode :Longest Palindromic Substring 最长回文子串
题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...
- 1. Longest Palindromic Substring ( 最长回文子串 )
要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- 005 Longest Palindromic Substring 最长回文子串
Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...
随机推荐
- 从微信小程序开发者工具源码看实现原理(二)- - 小程序技术实现
wxml与wxss的转换 1.wxml使用wcc转换 2.wxss使用wcsc转换 开发者工具主入口 视图层页面的实现 视图层页面实现技术细节 视图层快速打开原理 视图层新打开页面流程 业务逻辑层页面 ...
- Shell学习心得(四):流程控制
一.if else 1. if if 语句语法格式: if condition then command1 command2 ... commandN fi 写成一行(适用于终端命令提示符): ]; ...
- Git常用命令--了解这些就够了
<div class="show-content-free"> <blockquote> Csdn 将本地工程push到远程 方式一: 建立本地仓库 git ...
- “朕赐给你,才是你的;朕不给,你不能抢”--custome role在Azure权限管理中的简单实践
在开始详细讨论技术问题之前,有一些个人观点想发表一下: ---作为一个甲方云平台的掌控着,如果任何事情你都是让partner全部帮你搞定,自己既不审核也不研究,那无论是对于公司还是个人发展来说都是没任 ...
- Linux系统安装Tomcat——.tar.gz版(old)
这里简单地阐述一下rpm.deb.tar.gz的区别. rpm格式的软件包适用于基于Red Hat发行版的系统,如Red Hat Linux.SUSE.Fedora. deb格式的软件包则是适用于基于 ...
- tornado并发性能测试
1.带server2.0装饰器 接口访问数据库查询 并发100 平均每秒处理11.8次请求 平均响应时间6944ms 接口不做任何处理 并发100 平均每秒处理99.9次请求 平均响应时间3ms 并发 ...
- 关于STM32F103+ESP8266+阿里云过程之设备状态更新至阿里云(三)
设备与阿里云完成发布订阅的功能,接下来就是将设备状态如温湿度,PM2.5值上报更新至阿里云. 1.查看Topic. 在阿里云平台上 设备->Topic列表中查看.在产品中也可以看到对应的Topi ...
- Skier 游戏
# Listing_10-1.py # Copyright Warren Sande, 2009 # Released under MIT license http://www.opensource. ...
- TCP queue 的一些问题
转自Jasey Wang的blog,原文地址 首先回顾下三次握手里面涉及到的问题: 当 client 通过 connect 向 server 发出 SYN 包时,client 会维护一个 socket ...
- poj 1068 模拟
题目链接 大概题意就是告诉你有个n个小括号,每一个")"左边有多少个"("都告诉你了,然后让你求出每一对括号之间有多少对括号(包含自己本身). 思路: 我先计算 ...