方法一:中心扩展算法

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

算法时间复杂度:$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. MySQL- 常用的MySQL函数,指令等

    MySQL查看版本: status: 或者 select version(); //select @@version MySQL昨天, 一周前 ,一月前 ,一年前的数据 这里主要用到了 DATE_SU ...

  2. 十三 Django框架,CSRF跨站请求伪造

     全局CSRF 如果要启用防止CSRF跨站请求伪造,就需要在中间件开启CSRF #中间件 MIDDLEWARE = [ 'django.middleware.security.SecurityMidd ...

  3. 几个常用的url生成二维码的接口

    找到了几个URL生成的接口,速度上可能会有差别,可试验后选用,我用过第一个,分享: <!doctype html> <html lang="en"> < ...

  4. PHP 写入缓存

    1.创建file.PHP <?php class File{ //封装方法 private $_dir; const EXT='.text';//文件后缀,定义为常量 public functi ...

  5. OPcache

    1.介绍 OPcache 通过将 PHP 脚本预编译的字节码存储到共享内存中来提升 PHP 的性能, 存储预编译字节码的好处就是 省去了每次加载和解析 PHP 脚本的开销 2.配置 2.1 opcac ...

  6. ATL com的dll文件与tlb文件

    一..tlb文件: 只有COM组件才有tlb文件,普通dll文件没有. 包含内容: 1.它包含了COM类和接口的GUID值,接口的函数声明信息,并不是接口的实现文件.相当于类和接口的头文件. tlb文 ...

  7. git克隆某一个branch

    git clone -b <branch> <remote_repo> 例如: git clone -b 指定的分支名字

  8. test20190611 NOIP模拟赛

    题一:答题比赛 [问题描述] YYH报名参加了一个特殊的电视问答节目.这个节目共有n个问题,每回答正确1题,YYH就会获得1分,而每当YYH连续答对k题,那么他的现有得分乘以2,注意答对第k题后,是先 ...

  9. chrome中的content script脚本文件

    打开chrome的devtools工具,sources下有一个Content script: 1 chrome插件开发过程中难免会遇到使用content script来操作页面的dom,在chrome ...

  10. UOJ#164:【清华集训2015】V

    浅谈区间最值操作与历史最值问题:https://www.cnblogs.com/AKMer/p/10225100.html 题目传送门:http://uoj.ac/problem/164 论文题.论文 ...