【leetcode 5. 最长回文子串】解题报告

方法一:中心扩展算法
解题思路:从左到右每一个字符都作为中心轴,然后逐渐往两边扩展,只要发现有不相等的字符,则确定了以该字符为轴的最长回文串,但需要考虑长度为奇数和偶数的不同情况的处理(长度为偶数时轴心为中间两个数的中心,长度为奇数时轴心为中间那个数)
算法时间复杂度:$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. 最长回文子串】解题报告的更多相关文章
- LeetCode:最长回文子串【5】
LeetCode:最长回文子串[5] 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: ...
- 【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: " ...
- Java实现 LeetCode 5 最长回文子串
5. 最长回文子串 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab&quo ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- 【LeetCode】最长回文子串-中心扩展法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
- LeetCode 05 最长回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- leetcode python最长回文子串
回文的意思是正着念和倒着念一样,如:上海自来水来自海上,雾锁山头山锁雾,天连水尾水连天 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: & ...
- [LeetCode] 5. 最长回文子串
题目链接:https://leetcode-cn.com/problems/longest-palindromic-substring/ 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你 ...
- 【LeetCode】最长回文子串-动态规划法
[问题]给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 : 输入: "babad" 输出: "bab" 注意: ...
随机推荐
- django 使用内建过滤器实现文章摘要效果
django 使用内建过滤器实现文章摘要效果 前端html代码 <div class="list-group"> {% if articles %} {% for ar ...
- 图像处理检测方法 — SIFT和SURF
0.特征与匹配方法总结汇总对比 参考网址:http://simtalk.cn/2017/08/18/%E7%89%B9%E5%BE%81%E4%B8%8E%E5%8C%B9%E9%85%8D/#ORB ...
- PHP基础陷阱题(变量赋值)
PHP基础陷阱题代码,需要的朋友可以参考下 复制代码 代码如下: <?php $a=3; $b=6; if($a=5||$b=7){ $a++; $b++; } var_dump($a, $ ...
- Java集合类--->入门上篇
最近我又在研究Java语言,这是第五次还是第六次学习Java的集合类,你也许会惊讶为什么这么多次?哈哈,因为之前的我没有记录下来,忘记了,当然最主要还是觉得自己毅力不够,没有坚持.那么,这次我将换一种 ...
- Python基础-多线程与多进程
一,线程与进程之间的关系:(从知乎上看到的) 一个必须知道的事实:执行一段程序代码,实现一个功能的过程介绍 ,当得到CPU的时候,相关的资源必须也已经就位,就是显卡啊,GPS啊什么的必须就位,然后CP ...
- Python基础-数据写入execl
import xlwt book = xlwt.Workbook()#创建一个excel sheet = book.add_sheet('lanxia')#添加一个sheet页 title = ['姓 ...
- Eclipse_常用技巧_03_字母大小写转换快捷键
eclipse中字母大小写转换快捷键: ctrl+shift+x 转为大写 ctrl+shift+y 转为小写
- android 网络编程--socket tcp/ip udp http之间的关系
网络七层由下往上分别为物理层.数据链路层.网络层.传输层.会话层.表示层和应用层,一般编程人员接触最多的就是应用层和运输层,再往下的就是所谓的媒体层了,不是我们研究的对象. 下面是应用层.运输层,网络 ...
- BZOJ5362: [Lydsy1805月赛]quailty 算法
BZOJ5362: [Lydsy1805月赛]quailty 算法 https://lydsy.com/JudgeOnline/problem.php?id=5362 分析: 题意即求一个最小基环树森 ...
- bzoj 4504: K个串 可持久化线段树+堆
题目: Description 兔子们在玩k个串的游戏.首先,它们拿出了一个长度为n的数字序列,选出其中的一 个连续子串,然后统计其子串中所有数字之和(注意这里重复出现的数字只被统计一次). 兔子们想 ...