【Leetcode】Longest Palindromic Substring

时间:2023-02-21 13:42:16

问题: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]

   【Leetcode】Longest Palindromic Substring

  ** 如果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的更多相关文章

  1. 【LeetCode】Longest Palindromic Substring 解题报告

    DP.KMP什么的都太高大上了.自己想了个朴素的遍历方法. [题目] Given a string S, find the longest palindromic substring in S. Yo ...

  2. 【leetcode】Longest Palindromic Substring &lpar;middle&rpar; 经典

    Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...

  3. Leetcode&colon;【DP】Longest Palindromic Substring 解题报告

    Longest Palindromic Substring -- HARD 级别 Question SolutionGiven a string S, find the longest palindr ...

  4. 【leedcode】 Longest Palindromic Substring

    Given a , and there exists one unique longest palindromic substring. https://leetcode.com/problems/l ...

  5. 【翻译】Longest Palindromic Substring 最长回文子串

    原文地址: http://articles.leetcode.com/2011/11/longest-palindromic-substring-part-i.html 转载请注明出处:http:// ...

  6. 【LeetCode5】Longest Palindromic Substring&starf;&starf;

    1.题目描述: 2.解题思路: 题意:求一个字符串的最长回文子串. 方法一:中心扩展法.遍历字符串的每一个字符,如果存在回文子串,那么中心是某一个字符(奇数)或两个字符的空隙(偶数),然后分两种情况( ...

  7. 【LeetCode】647&period; Palindromic Substrings 解题报告(Python)

    [LeetCode]647. Palindromic Substrings 解题报告(Python) 标签: LeetCode 题目地址:https://leetcode.com/problems/p ...

  8. LeetCode&lpar;4&rpar; &vert;&vert; Longest Palindromic Substring 与 Manacher 线性算法

    LeetCode(4) || Longest Palindromic Substring 与 Manacher 线性算法 题记 本文是LeetCode题库的第五题,没想到做这些题的速度会这么慢,工作之 ...

  9. 【SPOJ】Longest Common Substring II (后缀自动机)

    [SPOJ]Longest Common Substring II (后缀自动机) 题面 Vjudge 题意:求若干个串的最长公共子串 题解 对于某一个串构建\(SAM\) 每个串依次进行匹配 同时记 ...

随机推荐

  1. &lbrack;JavaScript&rsqb;JS由来

    JavaScript最早由Netscape公司开发 JavaScript的发展历程 我们知道Windows桌面程序是可以交互的,用户可以点击菜单.按钮.下拉列表等控件,并通过消息机制来响应用户操作. ...

  2. Monyer&period;cn黑客小游戏

    花了一天的时间,Monyer给大家带来了一个有趣的东东——拥有15个关卡的黑客小游戏. 入口http://monyer.com/game/game1 因为一直以来都是大家跟我一起学习网络技术嘛,所以这 ...

  3. POJ 3624 Charm Bracelet

    DP 一直是心中痛,不多说了,这个暑假就坑在这上了. 这暑假第一道DP题,01背包问题. 题意是说物品有 重量和价值 ,但你能承受的重量有限,问你能带的最大价值. 这题数组开大点,尽管不知道有啥坑点, ...

  4. &num;Leet Code&num; Divide Two Integers

    描述:不使用 * / % 完成除法操作.O(n)复杂度会超时,需要O(lg(n))复杂度. 代码: class Solution: # @return an integer def dividePos ...

  5. 并行HASH JOIN小表广播问题

    SQL语句: SELECT /*+parallel(t1 16)*/ T1.DATA_DATE, T1.ACCT_NO, T1.ACCT_ORD, T1.ACCT_NO_PK, T1.ACCT_BAL ...

  6. &lpar;组合数学3&period;1&period;1&period;2&rpar;UVA 10098 Generating Fast&lpar;使用字典序思想产生所有序列&rpar;

    /* * UVA_10098.cpp * * Created on: 2013年10月8日 * Author: Administrator */ #include <iostream> # ...

  7. C&num; winform 加载网页 模拟键盘输入自动接入访问网络

    声明: 本文原创,首发于博客园 http://www.cnblogs.com/EasyInvoice/p/6070563.html 转载请注明出处. 背景: 由于所在办公室网络限制,笔者每天都使用网络 ...

  8. 字节数转换为b&comma;kb&comma;mb&comma;gb的方法 通用的手机流量计算方法

    //通用的手机流量计算方法 private String byteToMB(long size){ long kb = 1024; long mb = kb*1024; long gb = mb*10 ...

  9. HDU 3954 Level up(线段树&rpar;

    HDU 3954 Level up 题目链接 题意:k个等级,n个英雄,每一个等级升级有一定经验,每次两种操作,一个区间加上val,这样区间内英雄都获得当前等级*val的经验,还有一个操作询问区间经验 ...

  10. Python中的内置函数&lowbar;&lowbar;init&lowbar;&lowbar;&lpar;&rpar;的理解

    有点意思,本来我是学习java的.总所周知,java也有构造函数,而python在面向对象的概念中,也有构造函数.它就是 __init__(self) 方法. 其实类似于__init__()这种方法, ...