【Leetcode】Longest Palindromic Substring
问题:https://leetcode.com/problems/longest-palindromic-substring/
给定一个字符串 S,求出 S 的最长回文子串
思路:
1. 回文:一个字符串从前和从后读一致。S = "ABBA" 从前读:ABBA,从后读:ABBA
2. 最简单的做法:列出所有的子串,并判断是否是回文,从中找出最长的。
表格列出了所有的子串,第 i 行是以 S 的第 i 个字符开始的子串。S = "ABBA"
| 1 | A | AB | ABB | ABBA |
| 2 | B | BB | BBA | |
| 3 | B | BA | ||
| 4 | A |
从最后一行往上,可以看到他们的共同部分,用红色标出。共同的子问题~动态规划。
3. 动态规划,自底向上求解问题
1) 对子问题的结果进行存储和表示
len[i]:包含S[i] 的最长回文子串的长度
all[i]:S 的后半部分S[i, ..., n - 1] 中的最长回文子串长度
2) 把子问题的结果合并成它的上一层
子问题比它的上一层增加了一个字符。已经求得 S[i+1, ...] 子问题的解:从S[i+1]开始有len[i+1]长的回文子串 S[i+1]~S[n], all[i+1]

** 如果S[i]和这个子串的后一个字符一样,则从S[i]开始的回文子串可以包含它
比如:S="ABBA",已知 len[1] = 2,S[0]=S[3]="A",所以len[0] = len[1]+2
** 反之,从S[i]开始的回文子串不可以包含它,则需要对该子串从两头开始遍历
用两个变量分别从头 S[i] 和从尾S[n+1]开始比较,当发生不等的时候,就重新从头开始。
源码
class Solution {
public:
string longestPalindrome(string s) {
int ssize = s.length();
int i, j, k, start;
int* len = new int[ssize];
int* all = new int[ssize];
//初始化,最长为1
len[ssize - ] = all[ssize - ] = ;
start = ssize - ;
for(i = ssize - ; i >= ; --i)
{
//计算len[i]
if(i + len[i + ] + < ssize && s[i] == s[i + len[i + ] + ])//从S[i] 开始的回文子串包含S[i+1]开始的子串
len[i] = len[i + ] + ;
else//反之需要遍历
{
//j, k 表示从S[i] 开始可能的最长回文子串的区间
j = i;
k = i + len[i + ];
while(j < k)
{
if(s[j] == s[k])
{
++j;
--k;
}
else//两个字符不同时,j 需从头重新开始
{
j = i;
--k;
}
}
if(i == k && k == j)//
len[i] = ;
else
{
len[i] = (k - i + ) * ;//子串长度为偶数
if(j == k)//子串长度为奇数
len[i]--;
}
}
//计算all[i]
if(len[i] > all[i + ])
{
all[i] = len[i];
start = i;
}
else
{
if(len[i] == all[i + ])
start = i;
all[i] = all[i + ];
}
}
delete[] len;
delete[] all;
return s.substr(start, all[]);
}
};
【Leetcode】Longest Palindromic Substring的更多相关文章
- 【LeetCode】Longest Palindromic Substring 解题报告
DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...
- 【leetcode】Longest Palindromic Substring (middle) 经典
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- Leetcode:【DP】Longest Palindromic Substring 解题报告
Longest Palindromic Substring -- HARD 级别 Question SolutionGiven a string S, find the longest palindr ...
- 【leedcode】 Longest Palindromic Substring
Given a , and there exists one unique longest palindromic substring. https://leetcode.com/problems/l ...
- 【翻译】Longest Palindromic Substring 最长回文子串
原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...
- 【LeetCode5】Longest Palindromic Substring★★
1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...
- 【LeetCode】647. Palindromic Substrings 解题报告(Python)
[LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...
- LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法
LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...
- 【SPOJ】Longest Common Substring II (后缀自动机)
[SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...
随机推荐
- Sql Server FOR XML PATH
FOR XML PATH 有的人可能知道有的人可能不知道,其实它就是将查询结果集以XML形式展现,有了它我们可以简化我们的查询语句实现一些以前可能需要借助函数活存储过程来完成的工作.那么以一个实例为主 ...
- Linux/CentOS优化配置 汇总
[强烈要求做的]CentOS启用sudo,禁用root远程登录 Linux命令行修改IP.网关.DNS.主机名 的方法 Linux开机直接进入“命令行”模式 更改CentOS 6.x yum源为国内1 ...
- /etc/rc.d/rc与/etc/rc.d/init.d的关系
在这里先解释一下 /etc/rc.d/init.d 里面放的都是什么东西.这个目录存放的是一些脚本,一般是Linux以rpm包安装时设定的一些服务的启动/关闭脚本.系统在安装时装了好多rpm包,这里面 ...
- linux常用命令-文件搜索命令-find
find [目录] [选项] 文件名或者正则表达式 -name 根据文件名搜索 -iname 搜索文件名的时候忽略大小写 例:find /etc -name init find /etc -i ...
- 多线程更新UITableView时容易导致的问题
我请求同一个接口两次, 第一次是那缓存, 第二次是那网络数据在请求成功回调的主线程异步的, 先赋值数据源, 然后调用uitableview reloaddata的方法, 这时候问题来了 reloadd ...
- main(int argc, char **argv)参数解读
main(int argc, char **argv)参数解读 编译生成了test.exe ,然后在控制台下相应的目录下输入:test 1 2 3 4 argc就是一个输入了多少个参数,包括te ...
- python file
>>> help(open) Help on built-in function open in module __builtin__: open(...) open(name[, ...
- python 字典的函数
clear(),清空 注意单纯的赋值就相当于c语言中引用,只事额外起了一个别名,所以他们指向相同的地址, 所以令c={},只是另外开辟了一个新的空间让c为空,并没有改变之前的空间,所以{}与clear ...
- 无阻塞加载js,防止因js加载不了影响页面显示
浏览器加载静态资源和js的方式都是线性加载,所以一般情况可以将js放到</body>前,防止UI线程的阻塞. 而某些时候我们既希望js在整个网页的头部就加载,又担心js阻塞导致网站加载缓慢 ...
- Servlet 之 ServletContext
package cn.jiemoxiaodi.servlet_servletcontext; import java.io.IOException; import java.io.PrintWrite ...