【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" 注意: ...
随机推荐
- matlab查找最临近搜索knnsearch
Idx = knnsearch(X,Y) finds the nearest neighbor in X for each query point in Y and returns the indic ...
- (转)edm注意事项
格式编码 1.页面宽度请设定在600到800px以内,长度1024px以内. 2.HTML编码请使用utf-8. 3.HTML代码在15KB以内.(各个邮箱的收件标准不一样,如果超出15KB您的邮件很 ...
- java: jsp:param中文乱码
java: jsp:param中文乱码 假如a.jsp/b.jsp文件中 a.jsp代码: 需要加入:request.setCharacterEncoding("UTF-8") ...
- 快速构建hibernate框架
手动配置Hibernate框架的配置,极易出现问题,在Eclipse的web项目中,我们可以快速配置,方便快捷 一.导入Hibernate框架所需要的jar文件 二. 窗口—Perspective—打 ...
- css 多行文本以...代替
<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...
- codeforces 589G G. Hiring(树状数组+二分)
题目链接: G. Hiring time limit per test 4 seconds memory limit per test 512 megabytes input standard inp ...
- C++中函数模版和普通函数的区别
函数模版和同名普通函数在同一个作用域中,会优先调用那个函数? 函数模型在进行调用的时候会进行严格的类型匹配,而普通函数在调用的时候,会进行函数参数类型转换(前提是自动类型转换). 调用函数模版,本质是 ...
- Java中的泛型、枚举和注解
1.泛型: 一.为什么要有泛型(Generic)?1.解决元素存储的安全性问题任何类型都可以添加到集合中:类型不安全2.解决获取数据元素时,需要类型强转的问题读取出来的对象需要强转:繁琐可能有Clas ...
- 【IPC通信】key_t键和ftok函数
System V IPC分为三种: System V消息队列 System V信号量 System V共享内存区 这三种类型的IPC使用key_t值做为它们的名字. key_t这个数据类型在<s ...
- DEBUG命令详细说明
启动DEBUG 1.打开Windows命令窗口 在Windows 95/98的环境中,打开命令窗口的步骤为:点击“开始”→“运行”,输入“command”命令: 在WindowsXP及WIN7的环境中 ...