题目

Given a string s, find the longest palindromic substring in s. You may assume that the maximum length of s is 1000.

Example1:

  Input: "babad"

  Output: "bab"

  Note: "aba is also a valid answer. "

Example2:

  Input: "cbbd"

  Output: "bb"

思路


思路1:动态规划

Step1:刻画一个最优解方程

\(dp[i][j]\)表示子串\(s[i, \cdots,j]\)是否是一个回文子串

Step2:递归定义最优解的值

(1)初始化:

  • dp[i][i] = true, i = [0, 1, ... ,n-1];
  • dp[i][i-1] = true, i = [1,2,...,n-1]
  • 其余为false

(2)状态转移表

  • dp[i][j] = (s[i] == s[j] && dp[i+1][j-1])

状态转移表更新如图1:

Step3:计算最优解的值

根据状态转移表,以及递推公式,计算dp[i][j]。

思路2:中心扩展法

以某字符为中心,分别计算回文长度。分为回文子串为奇数、偶数两种情况

  • 奇数:以当前遍历字符为中心判断
  • 偶数:以当前遍历字符与其相邻字符为中心判断

思路3:Manacher算法

又称为马拉车算法,可以在时间复杂都为O(n)的情况下求解一个字符串的最长回文子串的问题。

Manacher算法通过为字符串虚拟增加#(并不是真的增加#),使得长度为奇数和长度为偶数的回文子串放在一起考虑(使得回文子串长度都为奇数),如图1。具体操作:在字符串的首部、尾部、相邻字符之间虚拟增加#号。

(1)Len数组的性质
(2)Len数组的计算

思路4:字符串分片(python)

利用字符串的分片操作来检测是否是回文。

Tips


动态规划

将待求解问题分解为若干个非互相独立的子问题,先求子问题,再求原问题。(通常需要将不同阶段的不同状态保存在二维数组内)。

C++


  • 思路1
class Solution {
public:
string longestPalindrome(string s) { int nLength = s.size();
if(nLength<1)
return s;
vector<vector<bool> > dp(nLength, vector<bool>(nLength, 0)); //dp[i][j]表示子串s[i,...,j]是否是一个回文子串
int strBegin = 0; //回文子串的开始
int strEnd = 0; //回文子串的结尾 //初始化
for(int i = 1;i < nLength; i++){
dp[i][i] = true;
dp[i][i-1] = true; //这个是针对子串长度为2,"bb"、"aa"的情况
}
dp[0][0] = true; //动态规划
for(int i = 2;i <= nLength; i++){ //回文长度
for(int j = 0; j <= nLength - i ; j++){ //回文子串起始 if(s[j] == s[i+j - 1] && dp[j+1][i+j-2]){
dp[j][j+i-1] = true;
if(strEnd - strBegin + 1 < i){
strBegin = j;
strEnd = i + j -1;
}
}
}
} return s.substr(strBegin,strEnd-strBegin+1);
}
};
  • 思路2
class Solution {
public:
string longestPalindrome(string s) { int nLength = s.size();
if(nLength == 1)
return s; int strBegin = 0;
int maxLength = 0;
for(int i = 1;i < nLength; i++){ //如果回文子串是奇数,以i为中心搜索
int left = i - 1;
int right = i + 1;
while(left >=0 && right < nLength && s[left] == s[right] )
{
left --;
right ++;
} if(right - left - 1 > maxLength){ //right -1 - (left + 1) + 1
maxLength = right - left - 1;
strBegin = left + 1;
} //如果回文子串是偶数,
left = i - 1;
right = i;
while(left >=0 && right < nLength && s[left] == s[right]){
left --;
right ++;
} if(right - left - 1 > maxLength){
maxLength = right - left - 1;
strBegin = left + 1;
}
}
return s.substr(strBegin,maxLength);
}
};
  • 思路3
class Solution {
public:
string longestPalindrome(string s) { if(s.size() <= 1)
return s; string dummy = init(s);
int nLength = dummy.size(); int maxLen = 0;
int mx = 0;
int id = 0;
vector<int> len(nLength, 0); for(int i =1;i< nLength - 1; i++){
if(i < mx)
len[i] = min(len[2*id -i], mx - i);
else
len[i] = 1; while(dummy[i - len[i]] == dummy[i + len[i]])
len[i] ++; if(mx < i + len[i]){
id = i;
mx = i + len[i];
}
} int index = 0;
for(int i = 1; i < nLength-1; i++){
if(len[i] > maxLen){
maxLen = len[i];
index = i;
}
}
return s.substr((index - maxLen)/2, maxLen-1); } //初始化
string init(const string& s){
string result = "$#";
int nLength = s.size(); for(int i=0;i < nLength; i++){ result.push_back(s[i]);
result.push_back('#');
} return result;
}
};

Python

class Solution(object):
def longestPalindrome(self, s):
"""
:type s: str
:rtype: str
""" if len(s) == 1:
return s result = "" for i in range(len(s)):
j = i + 1 while j <= len(s) and len(result) <= len(s[i:]):
if s[i:j] == s[i:j][::-1] and len(s[i:j]) > len(result):
result = s[i:j]
j += 1 return result

参考

[1] https://blog.csdn.net/suool/article/details/38383045

5. Longest Palindromic Substring[M]最长回文子串的更多相关文章

  1. 21.Longest Palindromic Substring(最长回文子串)

    Level:   Medium 题目描述: Given a string s, find the longest palindromic substring in s. You may assume ...

  2. 面试常用算法——Longest Palindromic Substring(最长回文子串)

    第一种: public static void main(String[] args) { String s = "abcbaaaaabcdcba"; int n,m; Strin ...

  3. Manacher's algorithm: 最长回文子串算法

    Manacher 算法是时间.空间复杂度都为 O(n) 的解决 Longest palindromic substring(最长回文子串)的算法.回文串是中心对称的串,比如 'abcba'.'abcc ...

  4. 最长回文子串-LeetCode 5 Longest Palindromic Substring

    题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  5. [译+改]最长回文子串(Longest Palindromic Substring) Part II

    [译+改]最长回文子串(Longest Palindromic Substring) Part II 原文链接在http://leetcode.com/2011/11/longest-palindro ...

  6. [译]最长回文子串(Longest Palindromic Substring) Part I

    [译]最长回文子串(Longest Palindromic Substring) Part I 英文原文链接在(http://leetcode.com/2011/11/longest-palindro ...

  7. 求最长回文子串 - leetcode 5. Longest Palindromic Substring

    写在前面:忍不住吐槽几句今天上海的天气,次奥,鞋子里都能养鱼了...裤子也全湿了,衣服也全湿了,关键是这天气还打空调,只能瑟瑟发抖祈祷不要感冒了.... 前后切了一百零几道leetcode的题(sol ...

  8. LeetCode:Longest Palindromic Substring 最长回文子串

    题目链接 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...

  9. lintcode :Longest Palindromic Substring 最长回文子串

    题目 最长回文子串 给出一个字符串(假设长度最长为1000),求出它的最长回文子串,你可以假定只有一个满足条件的最长回文串. 样例 给出字符串 "abcdzdcab",它的最长回文 ...

随机推荐

  1. js-字符串方法

    字符串 遍历字符串 方法:(类似数组) 使用for 或 for… in      结果:得到字符串中的每个字符 查找字符 ²  charAt(索引值) 注: 超出索引值范围时,则返回空字符 ²  ch ...

  2. Java 开源博客 Solo 1.1.0 发布 - 告别 GAE

    Solo 1.1.0 正式发布了,感谢一直以来关注 B3log 开源的朋友! 在这个版本中,我们对项目结构和发布包进行了重大调整: 各式***尚未普及,所以决定去除 GAE 版本 H2 版本使用人数较 ...

  3. Android图片剪裁库

    最近利用一周左右的业余时间,终于完成了一个Android图片剪裁库,核心功能是根据自己的理解实现的,部分代码参考了Android源码的图片剪裁应用.现在将该代码开源在Github上以供大家学习和使用, ...

  4. 1350 Taxi Cab Scheme DAG最小路径覆盖

    对于什么是DAG最小路径覆盖以及解题方法在我的另外的博客已经有了.http://www.cnblogs.com/Potato-lover/p/3980470.html 此题的题意: 公交车(出租车)车 ...

  5. hdu1507 最大匹配

    题目大意: 在 n*m在矩阵中,有一些点被标记为黑色,问可以多少对相邻的没有重复的白色块. 思路: 看上去与二分匹配毫无关系.但是没有其他好的解法,转化为二分匹配是正解.二分匹配的条件是{X,Y|E} ...

  6. PCL:解决PCL和OpenCV冲突的方法

    不是PCL的问题,而是OpenCV的问题. (1):先包含PCL库,再包含OpenCV库: (2):把里面的UCHAR冲突全部换掉!  如果你有闲情逸致,用正则表达式 慢慢替换去吧! (3):或者把F ...

  7. MVC传值前台

    ViewBag.model = bLL.GetModel((int)id); ViewBag.RecruitmentTime = ViewBag.model.RecruitmentTime.ToStr ...

  8. 初级模拟电路:1-2 PN结与二极管

    回到目录 1.   掺杂半导体 上面我们分析了本征半导体的导电情况,但由于本征半导体的导电能力很低,没什么太大用处.所以,一般我们会对本征半导体材料进行掺杂,即使只添加了千分之一的杂质,也足以改变半导 ...

  9. struts中日期处理以及文件下载

    日期处理 对于jsp提交的基本数据类型和日期格式为yyyy-MM-dd的自动转换为相应的 对于其它的日期格式需要自定义转换器 局部类型转换器 1,写转换器类(继承StrutsTypeConverter ...

  10. 路飞学城Python-Day77

    11-DIY一个web框架3 web框架 yuan功能总结 main.py: 启动文件,封装了socket 1 urls.py: 路径与视图函数映射关系 ---- url控制器 2 views.py ...