【LeetCode】最长回文子串【动态规划或中心扩展】
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。示例 2:
输入: "cbbd"
输出: "bb"来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-palindromic-substring
方法1:动态规划
最优子结构:当一个串是一个回文串的时候,在其头尾各加一个相同的字符组成的新字符串依旧是一个回文串
dp[i][j]=1,代表从下标i到下标j组成的字符串是一个回文串
如果s[i]==s[j]&&dp[i+1][j-1]==1,那么dp[i][j]=1
初始化:
1.对于一个字符的回文串:dp[i][i]=1
2.对于两个字符的回文串:如果s[i]==s[i+1],那么dp[i][i+1]=1
对于三个字符的回文串:如果s[i]==s[j]&&dp[i+1][j-1]==1,那么dp[i][j]=1
时间复杂度:O(N^2)
空间复杂度:O(N^2)
class Solution {
public:
string longestPalindrome(string s)
{
if(s.size()==)
return "";
if(s.size()==)
return s;
if(s.size()==&&s[]==s[])
return s;
int n=s.length();
int dp[n+][n+];
memset(dp,,sizeof(dp));
int ans=;
int start=;
for(int i=;i<n;i++)
{
dp[i][i]=;
}
for(int i=;i<n-;i++)
{
if(s[i]==s[i+])
{
dp[i][i+]=;
ans=;
start=i;
}
}
int l=;
while(l<=n)
{
for(int i=;i<n-l+;i++)
{
int j=i+l-;
if(dp[i+][j-]==&&s[i]==s[j])
{
dp[i][j]=;
start=i;
ans=l;
}
}
l++;
}
return s.substr(start,ans);
}
};
方法2:中心扩展法
将每个字符当作回文串的中心,然后往两边扩展,取扩展得到的回文串的最大值就是最长回文子串
考虑到回文串的奇偶情况,我们可以算两种情况:以一个字符为回文串的中心,以两个字符为回文串的中心,然后去二者最大值就可以
时间复杂度:O(N^2),以每个字符为中心需要遍历一次,然后每次都需要往两边扩展
空间复杂度:O(1),只需要用到一些常量
class Solution {
public:
int f1(string str,int left,int right,int n)
{
int c=;
//cout<<"left="<<left<<" right="<<right<<" n="<<n<<endl;
left--;
right++;
while(left>=&&right<n&&str[left]==str[right])
{
left--;
right++;
c+=;
}
return c;
}
int f2(string str,int left,int right,int n)
{
int c=;
if(str[left]==str[right])
c=;
else
{
c=;
return c;
}
left--;
right++;
while(left>=&&right<n&&str[left]==str[right])
{
left--;
right++;
c+=;
}
return c;
}
string longestPalindrome(string s)
{
int n=s.size();
if(n==)
return "";
if(n==)
return s;
if(n==&&s[]==s[])
return s;
int ans=;
int start=;
for(int i=;i<n-;i++)
{
int x1=f1(s,i,i,n);
int x2=f2(s,i,i+,n);
//cout<<"i="<<i<<" x1="<< x1<<" x2="<<x2<<endl;
if(max(x1,x2)>ans)
{
ans=max(x1,x2);
//cout<<"ans="<<ans<<endl;
if(ans%==)
start=i-ans/;
else
start=i-(ans-)/;
//cout<<"start="<<start<<endl;
}
}
return s.substr(start,ans);
}
};
还有一个解决方案是马拉车算法
时间复杂度为O(N)!!!
但是我目前也没有掌握,就没有贴出来,怕误导别人
【LeetCode】最长回文子串【动态规划或中心扩展】的更多相关文章
- [LeetCode]最长回文子串 java
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- leetcode -- 最长回文子串
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad" 输出: "bab" 注意: ...
- leetcode-5 最长回文子串(动态规划)
题目要求: * 给定字符串,求解最长回文子串 * 字符串最长为1000 * 存在独一无二的最长回文字符串 求解思路: * 回文字符串的子串也是回文,比如P[i,j](表示以i开始以j结束的子串)是回文 ...
- LeetCode.5-最长回文子串(Longest Palindromic Substring)
这是悦乐书的第342次更新,第366篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第3题(顺位题号是5).给定一个字符串s,找到s中最长的回文子字符串. 您可以假设s ...
- LeetCode最长回文子串
题目: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为 1000. 示例 1: 输入: "babad"输出: "bab"注意: & ...
- 【C++】最长回文子串/动态规划
ACM #include <bits/stdc++.h> using namespace std; const int maxn = 1010; char S[maxn]; int dp[ ...
- [LeetCode] 5. 最长回文子串 ☆☆☆(最长子串、动态规划)
最长回文子串 (动态规划法.中心扩展算法) https://leetcode-cn.com/problems/longest-palindromic-substring/solution/xiang- ...
- Leetcode(5)-最长回文子串(包含动态规划以及Manacher算法)
给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度为1000. 示例 1: 输入: "babad" 输出: "bab" 注意: &quo ...
- LeetCode(5):最长回文子串
Medium! 题目描述: 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 长度最长为1000. 示例: 输入: "babad" 输出: "bab&quo ...
随机推荐
- IGC(Interleaved Group Convolutions)
深度学习被引起关注是在2012年,用神经网络训练的一个分类模型在ImagNet上取得了第一名,而且其分类精度比第二名高出10多个点,当时所使用的模型为AlexNet,现在看来其为一个比较简单的网络,而 ...
- Codeforces Round #605 (Div. 3) B. Snow Walking Robot(构造)
链接: https://codeforces.com/contest/1272/problem/B 题意: Recently you have bought a snow walking robot ...
- BZOJ 1034: [ZJOI2008]泡泡堂BNB 贪心+排序
比较神奇的贪心 有点类似于田忌赛马. 如果我方最弱强于对面最弱,则直接最弱pk最弱. 如果我方最强强于对面最强,那么直接最强间pk. 否则,试着用我方最弱 pk 对方最强,看是否能打成平手. code ...
- java 数组逆序输出(方法内部的代码)
//现在数组中有1, 2, 4, 5, 6, 7, 8 请逆序输出 int [] arrs={1,2,3,4,5,6,7,8}; for(int i=arrs.length-1;i>-1;i-- ...
- Centos 7 更换为 阿里云 yum 源
地址: https://opsx.alibaba.com/ 操作步骤: 1.备份 mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentO ...
- 【洛谷】P1032 字串变换
题目地址:https://www.luogu.org/problemnew/show/P1032 洛谷训练场BFS的训练题呀. “BFS不就是用队列的思想去遍历一切情况嘛.我已经不是小孩子了,我肯定能 ...
- elasticsearch: can not run elasticsearch as root
进入bin目录启动elasticsearch: lunadeMacBook-Air:elasticsearch-6.1.0 luna$ cd bin/ lunadeMacBook-Air:bin lu ...
- Intellij IDEA 智能补全的 10 个姿势,太牛逼了。。
一年多前,栈长那时候刚从 Eclipse 转型 IDEA 成功,前面转了好多次,都是失败史,都是泪..后面我就在微信公众号 "Java技术栈" 写了这篇文章:Intellij ID ...
- 基于Hadoop爬虫网易云歌曲评论
作业要求来自于:https://edu.cnblogs.com/campus/gzcc/GZCC-16SE2/homework/3339 本次选取的是爬取歌曲<大碗宽面>的歌评数据 1.将 ...
- mysql查询列定义,是否自增等
SELECT ORDINAL_POSITION AS Colorder, Column_Name AS ColumnName, data_type AS TypeName, COLUMN_COMMEN ...