问题: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\) 每个串依次进行匹配 同时记 ...
随机推荐
-
[JavaScript]JS由来
JavaScript最早由Netscape公司开发 JavaScript的发展历程 我们知道Windows桌面程序是可以交互的,用户可以点击菜单.按钮.下拉列表等控件,并通过消息机制来响应用户操作. ...
-
Monyer.cn黑客小游戏
花了一天的时间,Monyer给大家带来了一个有趣的东东——拥有15个关卡的黑客小游戏. 入口http://monyer.com/game/game1 因为一直以来都是大家跟我一起学习网络技术嘛,所以这 ...
-
POJ 3624 Charm Bracelet
DP 一直是心中痛,不多说了,这个暑假就坑在这上了. 这暑假第一道DP题,01背包问题. 题意是说物品有 重量和价值 ,但你能承受的重量有限,问你能带的最大价值. 这题数组开大点,尽管不知道有啥坑点, ...
-
#Leet Code# Divide Two Integers
描述:不使用 * / % 完成除法操作.O(n)复杂度会超时,需要O(lg(n))复杂度. 代码: class Solution: # @return an integer def dividePos ...
-
并行HASH JOIN小表广播问题
SQL语句: SELECT /*+parallel(t1 16)*/ T1.DATA_DATE, T1.ACCT_NO, T1.ACCT_ORD, T1.ACCT_NO_PK, T1.ACCT_BAL ...
-
(组合数学3.1.1.2)UVA 10098 Generating Fast(使用字典序思想产生所有序列)
/* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> # ...
-
C# winform 加载网页 模拟键盘输入自动接入访问网络
声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处. 背景: 由于所在办公室网络限制,笔者每天都使用网络 ...
-
字节数转换为b,kb,mb,gb的方法 通用的手机流量计算方法
//通用的手机流量计算方法 private String byteToMB(long size){ long kb = 1024; long mb = kb*1024; long gb = mb*10 ...
-
HDU 3954 Level up(线段树)
HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验 ...
-
Python中的内置函数__init__()的理解
有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法, ...