方法一:中心扩展算法

解题思路:从左到右每一个字符都作为中心轴,然后逐渐往两边扩展,只要发现有不相等的字符,则确定了以该字符为轴的最长回文串,但需要考虑长度为奇数和偶数的不同情况的处理(长度为偶数时轴心为中间两个数的中心,长度为奇数时轴心为中间那个数)

算法时间复杂度:$O(n^{2})$

    string longestPalindrome(string s) {
int idx = , maxL = ;
for (int i = ; i < s.size(); ++i)  // i为轴的位置,j为回文串半径
{
for (int j = ; i - j >= && i + j < s.size(); ++j) // 奇数
{
if (s[i - j] != s[i + j])
break;
if ( * j + > maxL)
{
maxL = * j + ;
idx = i - j;
}
}
for (int j = ; i - j >= && i + j + < s.size(); ++j) // 偶数
{
if (s[i-j]!=s[i+j+])
break;
if ( * j + > maxL)
{
maxL = * j + ;
idx = i - j;
}
}
}
return s.substr(idx, maxL);
}

方法二:manacher(马拉车法)

解题思路:详见P3805 【模板】manacher算法

算法时间复杂度为:$O(n)$

    int pos[],p[];
string longestPalindrome(string s) {
/* 填充字符,统一为奇数串 */
string s_new="~";
for (int i=,k=;i<s.size();++i)
{
s_new+="#";
s_new+=s[i];
pos[k++]=i; // 记录新字串与原始字串的位置关系
pos[k++]=i;
}
s_new+="#"; /* manacher */
int m=,r=,maxL=,idx=;
for (int i=;i<s_new.size();++i)
{
// 获取已知的最小回文半径
if (i<r)
p[i]=min(p[*m-i],r-i);
else
p[i]=;
// 暴力拓展左右两侧
while (s_new[i-p[i]]==s_new[i+p[i]])
p[i]++;
// 新的回文半径比较大,则更新
if (r-i<p[i])
{
m=i;
r=i+p[i];
}
// 更新回文长度(原始字串的回文长度为新字串回文半径-1)
if (p[i]->maxL)
{
maxL=p[i]-;
idx=pos[i]-maxL/; // 更新原始回文字串的起始位置
}
}
return s.substr(idx,maxL);
}

【leetcode 5. 最长回文子串】解题报告的更多相关文章

  1. LeetCode:最长回文子串【5】

    LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...

  2. 【LeetCode】最长回文子串【动态规划或中心扩展】

    给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...

  3. Java实现 LeetCode 5 最长回文子串

    5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...

  4. [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)

    最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...

  5. 【LeetCode】最长回文子串-中心扩展法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...

  6. LeetCode 05 最长回文子串

    题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...

  7. leetcode python最长回文子串

    回文的意思是正着念和倒着念一样,如:上海自来水来自海上,雾锁山头山锁雾,天连水尾水连天 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: & ...

  8. [LeetCode] 5. 最长回文子串

    题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你 ...

  9. 【LeetCode】最长回文子串-动态规划法

    [问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...

随机推荐

  1. el表达式判断字符串相等

    el表达式判断字符串相等 Java code 1 ${"a" == "a"}  ${"b" eq "b"}  都可以 & ...

  2. ReactJS结合ES6入门Template

    一.前言 二.介绍 ReactJS ECMAScript 6 三.入门DEMO "Hello,XXX“ 输出 ES5写法 <div id="example"> ...

  3. nodejs调试:node-inspector

    基于Chrome浏览器的调试器 既然我们可以通过V8的调试插件来调试,那是否也可以借用Chrome浏览器的JavaScript调试器来调试呢?node-inspector模块提供了这样一种可能.我们需 ...

  4. 搭建DNS服务器-bind

    1. 安装 yum install -y bind-chroot yum install -y bind-utils service named-chroot start    2. 修改配置 增加一 ...

  5. 洛谷 1351 联合权值——树形dp

    题目:https://www.luogu.org/problemnew/show/P1351 对拍了一下,才发现自己漏掉了那种拐弯的情况. #include<iostream> #incl ...

  6. Azure自动化部署服务 (2)

    上一篇文章介绍了如何通过添加用户名和密码的方式实现自动化部署服务中与Azure Subscription的连接. 本文将介绍如何使用证书的方式实现Azure Automation与Azure的Subs ...

  7. POJ3468(树状数组区间维护)

    A Simple Problem with Integers Time Limit: 5000MS   Memory Limit: 131072K Total Submissions: 89818   ...

  8. Ruby模块(module)

    Ruby模块(module) 2013-04-03 16:47:09|  分类: Ruby |  标签:ruby  require  load  extend  include  |字号 订阅     ...

  9. phpstorm断点调试 php.ini 文件中 Xdebug 配置

    [XDebug]xdebug.profiler_output_dir="D:\phpStudy\tmp\xdebug"xdebug.trace_output_dir="D ...

  10. [原创] 新人分享--ORA-01012:not logged on的解决办法 [复制链接]

    转自:http://f.dataguru.cn/thread-82530-1-1.html