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,那么沿着中轴线 ...
随机推荐
- libevent (三) 事件注册与循环监听
事件注册与循环监听 在libevent中为了监听某种事件的发生,设置事件触发后的回调函数,也就是说对该事件注册到当前的IO模型中. 事件注册 事件初始化 使用`event_new`函数来对事件进行初始 ...
- pro02总结:spring mvc + jdbc
在pro01的基础上,加入springMVC. applicationContext.xml: <?xml version="1.0" encoding="UTF- ...
- iOS开发----调用地图导航
注意:本文章下的代码有个别变量未知,所以是不能直接跑通的,我也是转别人的 在IOS6.0系统后,兼容iOS5.0与iOS6.0地图导航,需要分两个步骤 #define SYSTEM_VERSION_L ...
- 一个映射到mac风格按键的AHK脚本(替换虚拟机键盘映射)
Mac键位映射(部分) win+q 退出程序 win+w 关闭当前页面 win+h 隐藏当前窗口 win+shift+h 隐藏其他窗口 win+s 保存 win+o 打开 win+z 撤销 win+s ...
- NUnitForms 测试GUI应用程序的优秀工具
著名的NUnit是单元测试的优秀工具,但是要在一个测试方法中启动GUI程序,比如Windows Form界面,这比较难做到.NUnitForms就是为解决这个问题产生的,它是NUnit的一个扩展程序, ...
- web应用程序 ---- 日志系统的设计
最近在做一个小的项目,是web的应用程序,最近也有点时间,把日志管理来简单的说说. 日志,就是需要记录一些自己感兴趣的信息,把它保存起来,具体保存在哪里?保存多长时间?这些要求都是根据不同的项目需求而 ...
- framework4.0注册到IIS
C:\WINDOWS\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -ir -enable C:\WINDOWS\Microsoft.NET ...
- HBase + Kerberos 配置示例(二)
接上篇<HBase + Kerberos配置示例(一)>,我们继续剩下的配置工作. 环境准备 Hadoop配置 Zookeeper配置 HBase配置 Java测试程序 环境准备 安装ha ...
- android自适应屏幕方向和大小
一:不同的layout Android手机 屏幕 大小不一,有480x320, 640x360, 800x480.怎样才能让App自动 适应不同的屏幕 呢? 其实很简单,只需要在res目录下 ...
- nginx 重写 rewrite 基础及实例
nginx rewrite 正则表达式匹配 大小写匹配 ~ 为区分大小写匹配 ~* 为不区分大小写匹配 !~和!~*分别为区分大小写不匹配及不区分大小写不匹配 文件及目录匹配 -f和!-f用来判断是否 ...