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,那么沿着中轴线 ...
随机推荐
- Uniscribe文字自动换行
转载:http://blog.csdn.net/jianlizhao66/article/details/1480457 我们获得了每个字形的宽度数组piAdvances,以及这个RUN所占用的总 ...
- [ucgui] 彩色条函数
/* 颜色条 */ void ShowColorBar(void) { , y0 = , yStep = , i; int NumColors = LCD_GetDevCap(LCD_DEVCAP_N ...
- JsRender实用教程(tag else使用、循环嵌套访问父级数据)
前言 JsRender是一款基于jQuery的JavaScript模版引擎,它具有如下特点: · 简单直观 · 功能强大 · 可扩展的 · 快如闪电 这些特性看起来很厉害,但几乎每个模版引擎, ...
- jQuery的XX如何实现?——3.data与cache机制
往期回顾: jQuery的XX如何实现?——1.框架 jQuery的XX如何实现?——2.show与链式调用 -------------------------- 源码链接:内附实例代码 jQuery ...
- JProfiler使用详细教程学习笔记
JProfiler学习笔记 推荐文章:JProfiler 入门教程 一.安装JProfiler 从http://www.ej-technologies.com/下载5.1.2并申请 ...
- 在Mac OS上安装Vagrant和Docker的教程
转载于:http://www.itxuexiwang.com/a/shujukujishu/redis/2016/0216/128.html?1455808640 当听到很多人在说Docker是多么多 ...
- Leetcode 13 Roman to Integer 字符串处理+STL
题意:将罗马数字1到3999转化成自然数字,这里用了STL库map将罗马字符映射到自然数字. I,V,X,L,C,D,M -> 1,5,10,50,100,500,1000 m[s[i]]< ...
- C#中使用DES和AES加密解密
C#中使用DES和AES加密解密 2008-01-12 09:37 using System;using System.Text;using System.Security.Cryptography; ...
- javascript效果:手风琴、轮播图、图片滑动
最近都没有更,就来几个效果充实一下. 都没有进行美化这步. 手风琴: 纯css: <!DOCTYPE html> <html lang="en"> < ...
- 移动页面HTML5自适应手机屏幕宽度
标签: 网上关于这方面的文章有很多,重复的东西本文不再赘述,仅提供思路,并解释一些其他文章讲述模糊的地方. 1.使用meta标签,这也是普遍使用的方法,理论上讲使用这个标签是可以适应所有尺寸的屏幕的, ...