LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium
题目:
Given a string S, find the longest palindromic substring in S. You may assume that the maximum length of S is , and there exists one unique longest palindromic substring.
解题思路:
1、简单思路:暴力破解法,时间复杂度O(n^3),肯定通不过。
2、动态规划法:(一般含“最XX”等优化词义的题意味着都可以动态规划求解),时间复杂度O(n^2),空间复杂度O(n^2)。
形如"abba", "abbba"这样的字符串,如果用dp[i][j]表示从下标i到j之间的子字符串所构成的回文子串的长度,则有:
dp[i][j] = dp[i+1][j-1] && s[i] == s[j]
初始化:
奇数个字符:dp[i][i] = 1; 偶数个字符:dp[i][i+1] = 1
//动态规划法
string LongestPalindromicStringDP(string str)
{
size_t n = str.size();
if (n == || n == )
return str;
//创建dp二维数组
//d[i][j] = dp[i+1][j-1] && s[i] == s[j]
bool **dp = new bool *[n];
for (size_t i = ; i < n; ++ i)
dp[i] = new bool[n]; int nLongestIndex = ; //最长回文子串的开始下标
int nMaxLen = ; //长度 for (size_t i = ; i < n; i ++)
for (size_t j = ; j < n; j ++)
dp[i][j] = false;
for (size_t i = ; i < n; ++ i)
dp[i][i] = true; //初始化一个字母 for (size_t i = ; i < n - ; ++ i) {
if (str[i] == str[i+]) {
dp[i][i+] = true; //初始化两个相同的字母"aa"
nLongestIndex = i;
nMaxLen = ;
}
}
//从长度3开始操作, (aba)ba, a(bab)a, ab(aba)
for (size_t len = ; len <= n; ++ len) {
for (size_t i = ; i < n-len+; ++ i) {
size_t j = i + len - ;
if (str[i] == str[j] && dp[i+][j-]){
dp[i][j] = true;
nLongestIndex = i;
nMaxLen = len;
}
}
} //释放dp
for (size_t i = ; i < n; ++ i)
delete []dp[i];
delete []dp; return str.substr(nLongestIndex, nMaxLen);
}
3、中心扩散法:时间复杂度O(n^2),空间复杂度O(1)
顾名思义,从一个节点,分别向两边扩散,用两个指针分别向前向后遍历。

//中心扩散法
string LongestPalindromicString(string str)
{
size_t n = str.size();
if (n == || n == )
return str; size_t start = ;
size_t nMaxLen = ; for (size_t i = ; i < n; ++ i) {
size_t j = i, k = i; //分别从中心向两边扩散
while(k < n- && str[k] == str[k+])
k++; //有相同字母的情况:"aaa"
while(j > && k < n- && str[j-] == str[k+]){
k++; //不同字母情况: "aba"
j--;
}
if(k-j+ > nMaxLen){
nMaxLen = k-j+;
start = j;
}
}
return str.substr(start, nMaxLen);
}
4、很明显,这两种方法时间复杂度还是太高了,还有一种算法叫Manacher,时间复杂度能够降为O(n),空间复杂度也为O(n),先记下,以后再做研究吧。
LeetCode:5_Longest Palindromic Substring | 最长的回文子串 | Medium的更多相关文章
- [LeetCode] Longest Palindromic Substring 最长回文串
Given a string S, find the longest palindromic substring in S. You may assume that the maximum lengt ...
- LeetCode 5_Longest Palindromic Substring
LeetCode 5_Longest Palindromic Substring 题目描写叙述: Given a string S, find the longest palindromic sub ...
- LeetCode[5] 最长的回文子串
题目描述 Given a string S, find the longest palindromic substring in S. You may assume that the maximum ...
- leetcode 5 查找最长的回文子串
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &qu ...
- manacher算法处理最长的回文子串(二)
在上篇<manacher算法处理最长的回文子串(一)>解释了manacher算法的原理,接着给该算法,该程序在leetcode的最长回文子串中通过.首先manacher算法维护3个变量.一 ...
- python经典算法题:求字符串中最长的回文子串
题目 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- bzoj2565 最长双回文子串
Description 顺序和逆序读起来完全一样的串叫做回文串.比如acbca是回文串,而abc不是(abc的顺序为“abc”,逆序为“cba”,不相同).输入长度为n的串S,求S的最长双回文子串T, ...
- 给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- manacher算法处理最长的回文子串(一)
引言 相信大家都玩过折叠纸张,如果把回文串相当于折叠一个A4纸,比如ABCDDCBA就是沿着中轴线(D与D之间)对折重合,那么这个就是一个回文串.或者是ABCDEDCBA的中轴线就是E,那么沿着中轴线 ...
随机推荐
- 多网卡的7种bond模式原理
多网卡的7种bond模式原理 Linux 多网卡绑定 网卡绑定mode共有七种(0~6) bond0.bond1.bond2.bond3.bond4.bond5.bond6 常用的有三种 mode=0 ...
- 用dom操作替代正则表达式
在B/S结构客户端越来越“胖”的今天,作为一名全端程序员,您很可能会在前端操作html字符串,注意,是操作html字符串,不是操作当前页面的html. 举个例子,百度推出的在线HTML富文本编辑器Ue ...
- js继承精益求精之寄生式组合继承
一.混合/组合继承的不足 上一篇JS继承终于混合继承,认真思考一下,发现其还是有不足之处的: 空间上的冗余:在使用原型链的方法继承父类的原型属性(Animal.prototype)的同时,也在子类的原 ...
- Gatling->次时代性能测试利器
Gatling作为一款开源免费的性能测试工具越来越受到广大程序员的欢迎.免费当然是好的,最缺钱的就是程序员了;开源更好啊,缺啥功能.想做定制化的可以自己动手,丰衣足食.其实我最喜欢的原因是其提供了简洁 ...
- 《介绍一款开源的类Excel电子表格软件》续:七牛云存储实战(C#)
两个月前的发布的博客<介绍一款开源的类Excel电子表格软件>引起了热议:在博客园有近2000个View.超过20个评论. 同时有热心读者电话咨询如何能够在SpreadDesing中实现存 ...
- 通过实验窥探javascript的解析执行顺序
简介 javascript是一种解释型语言,它的执行是自上而下的.但是各浏览器对于[自上而下]的理解是有细微差别的,而代码的上下游也就是程序流对于程序正确运行又是至关重要的.所以我们有必要深入理解js ...
- 老生常谈JavaScript闭包
闭包就是指一个有权访问另外一个函数作用域中的变量的函数.--<JavaScript高级程序第三版> 本人对于闭包初次的认识就来自<高三>,首先仅仅通过“有权”’两个字我们便可以 ...
- paip.文件目录操作uAPI php python java对照
paip.文件目录操作uAPI php python java对照 chdir -- 改变目录 chroot -- 改变根目录 dir -- directory 类 closedir -- 关闭目录句 ...
- linux开发神器--Tmux
在Linux上工作的朋友,可能会常常遇到这种情况: 痛点1: 在公司用putty连着Linux开发机,程序正跑着,不知不觉到了下班的时候,要和老婆/女朋友约会了,但是程序还没跑完,并且进度有点紧,还得 ...
- Objective-c中 isEqual ,isEqualToString , == 三者的区别
首先 OC中的对象都是用指针表示,方法的调用是基于消息机制实现,== 比较的自然是指针指向的地址 然后 说下 isEqual 和 isEqualToString 的区别 IsEqual 是 NSObj ...