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是对称的)

 

给出代码:

 1 class Solution {
 2 public:
 3     string longestPalindrome(string s) {
 4         //扩展
 5         string expend_s;
 6         expend_s+=‘$‘;
 7         int len = s.length();
 8         for(int i = 0; i < len; i++){
 9             expend_s+=‘#‘;
10             expend_s+=s[i];
11         }
12         expend_s+=‘#‘;
13         //定义
14         int p[2*expend_s.length()];
15         memset(p,0,sizeof(p));
16         int mx = 1, id = 1;
17         int max = 0, maxid = 0;//保存最大回味子串搜索长度和位置
18         //求p
19         for(int i = 1; i < expend_s.length(); i++){
20             int j = 2*id - i;
21             if(p[j]<mx-i){
22                 p[i] = p[j];
23             }
24             else{
25                 for(;expend_s[i+p[i]]==expend_s[i-p[i]]; p[i]++){
26                     if(i+p[i]>=expend_s.length())break;//要判断右侧是否越界
27                 }
28                 mx = i+p[i];
29                 id = i;
30             }
31             if(max < p[i]){
32                 max = p[i];
33                 maxid = i;
34             }
35         }
36         string ans;
37         for(int i = maxid-max+1; i <= maxid+max-1; i++){
38             if(expend_s[i]!=‘#‘){
39                 ans+=expend_s[i];
40             }
41         }
42         return ans;
43     }
44 };

  



原文地址:https://www.cnblogs.com/shanyr/p/11414739.html

时间: 2024-10-08 01:19:24

Leetcode 5. Longest Palindromic Substring(最长回文子串, Manacher算法)的相关文章

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: Input: "babad" Output: "bab" Note: "aba" is also a valid answer. Example: Input: "cbbd" Ou

LeetCode 5 Longest Palindromic Substring 最长回文子序列 manacher算法 string.substr 难度:2

https://leetcode.com/problems/longest-palindromic-substring/ manacher算法:http://blog.csdn.net/ywhorizen/article/details/6629268 string longestPalindrome(string s) { char ch[2001];int p[2001]; ch[2*s.size()] = 0; for(int i = 0; i < 2 * s.size(); i++) {

[C++]LeetCode: 99 Longest Palindromic Substring (最长回文子串)

题目:Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路:题目要求的s的一个最长回文子串.暴力解决办法就是枚举所有的子串,再对每个子串进行回文判断.进行剪枝,我们考虑可以使用动态规划来避免重复的判

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

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 最长回文子串Longest palindromic substring, 最长回文子串或最长对称因子问题是在一个字符串中查找一个最长连续子串,这个子串

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

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 解法一:考虑回文字符串paliStr的特征,分为字符串长度为奇偶两种情况:(1)paliStr.size()为奇数时,则从最中间的一个字符往两边扩展是

LeetCode 5:Longest Palindromic Substring(最长回文串)

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 思路一:(超时)简单的截取长度为length(length递减)的字串,判断其是否为回文串.第一个满足要求的回文串最长. public class S

Leetcode 5 Longest Palindromic Substring (最长回文子字符串)(动态规划)

Leetcode 5 题目描述 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: Inp

[Leetcode] Longest palindromic substring 最长回文子串

Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is 1000, and there exists one unique longest palindromic substring. 做这道题之前要先了解什么是回文子串.回文串通俗的解释是,分别从字符串两端开始遍历,得到的结果相同,如"abba",从两端的遍历结果都是:&q

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

原文地址: http://www.cnblogs.com/zhxshseu/p/4947609.html%20 转载请注明出处:http://www.cnblogs.com/zhxshseu/p/4947609.html 问题描述:Given a string S, find the longest palindromic substring in S. 这道题目是一个经典的动态规划DP http://challenge.greplin.com/问题,在面试中经常会被问到.为什么?因为这个问题可