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算法)的更多相关文章

  1. 5. Longest Palindromic Substring(最长回文子串 manacher 算法/ DP动态规划)

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  2. [LeetCode] 5. Longest Palindromic Substring 最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  3. [leetcode]5. Longest Palindromic Substring最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

  4. 【LeetCode】5. Longest Palindromic Substring 最长回文子串

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 公众号:负雪明烛 本文关键词:最长回文子串,题解,leetcode, 力扣,python ...

  5. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  6. lintcode :Longest Palindromic Substring 最长回文子串

    题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...

  7. 1. Longest Palindromic Substring ( 最长回文子串 )

    要求: Given a string S, find the longest palindromic substring in S. (从字符串 S 中最长回文子字符串.) 何为回文字符串? A pa ...

  8. 【翻译】Longest Palindromic Substring 最长回文子串

    原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...

  9. 005 Longest Palindromic Substring 最长回文子串

    Given a string s, find the longest palindromic substring in s. You may assume that the maximum lengt ...

随机推荐

  1. UTF-16 -- 顶级程序员也会忽略的系统编码问题,JDK 错了十年!

    Unicode(统一码.万国码.单一码)是计算机科学领域里的一项业界标准,包括字符集.编码方案等.Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一 ...

  2. 《C# 语言学习笔记》——定义属性

    属性定义的方式与字段类似,但包含的内容比较多. 属性拥有两个类似于函数的块,一个块用于获取属性的值,另一个块用于设置属性的值.这两个块也称访问器,分别用于get和set关键字定义,可以用于控制对属性的 ...

  3. 关于Spring的JDBC连接mysql(与传统jdbc比较)

    Spring的jdbc与Hibernate,Mybatis相比较,功能不是特别强大,但是在小型项目中,也到还是比较灵活简单. 首先可以看看一下传统的jdbc是如何操作的呢 传统JDBC 首先呢先要创建 ...

  4. UTF—8与UTF—8(无bom)格式

    BOM——Byte Order Mark,就是字节序标记 在UCS 编码中有一个叫做"ZERO WIDTH NO-BREAK SPACE"的字符,它的编码是FEFF.而FFFE在U ...

  5. Transformations 方块转换 USACO 模拟 数组 数学 耐心

    1006: 1.2.2 Transformations 方块转换 时间限制: 1 Sec  内存限制: 128 MB提交: 10  解决: 7[提交] [状态] [讨论版] [命题人:外部导入] 题目 ...

  6. LFS8.3BOOT引导疑点解决

    LFS系统 的BOOT引导 在LFS书中写到的BOOT引导,时直接将宿主机的BOOT分区挂载当LFS的BOOT分区中,虽然这样也是可以实现BOOT引导的,但是我并不想这样做,所以BOOT引导就变得有些 ...

  7. Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353)

    Jenkins Java 反序列化远程执行代码漏洞(CVE-2017-1000353) 一.漏洞描述 该漏洞存在于使用HTTP协议的双向通信通道的具体实现代码中,jenkins利用此通道来接收命令,恶 ...

  8. 9-1、大型项目的接口自动化实践记录----数据库结果、JSON对比

    上一篇写了如何从DB获取预期.实际结果,这一篇分别对不同情况说下怎么进行对比. PS:这部分在JSON对比中也适用. 1.结果只有一张表,只有一条数据 数据格式:因为返回的是dicts_list的格式 ...

  9. Selenium+java - 借助autolt完成上传文件操作

    写在前面: 上传文件是每个自动化测试同学会遇到,而且可以说是面试必考的问题,标准控件我们一般用sendkeys()就能完成上传,但是我们的测试网站的上传控件一般为自己封装的,用传统的上传已经不好用了, ...

  10. JDK1.8源码分析03之idea搭建源码阅读环境

    序言:上一节说了阅读源码的顺序,有了一个大体的方向,咱们就知道该如何下手.接下来,就要搭建一个方便阅读源码及debug的环境.有助于跟踪源码的调用情况. 目前新开发的项目, 大多数都是基于JDK1.8 ...