- 题目描述
- 题解
- 代码奉上
- 复杂度分析
- 闲话
题目描述
给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例一
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。
示例二
输入: “cbbd”
输出: “bb”
题目来源
题解
首先,我们先从题目描述中得知,在一个字符串s要找到一个最长的回文字符串.在我看来,如果一个大佬把动态规划最多了,一看到一个最长,最多,最小,思路都将引向动态规划.你们都是大佬而我不是.
所以我们的思路要定在动态规划上,那么我们就要得出状态转移方程.
思路:
-
如果你要找一个回文字符串,那么他的前后字符都将是相等的,所以在一个字符串s里,如果你发现了前面某一个字符和对应的字符相等,且两个字符之间字符串也是一个回文字符串,那么这个字符串是最长的回文字符串吗?----相信你也知道答案是肯定的.
-
既然我们确定了我们确定最长字符串的方式,那么我们就要将其转化成一个状态转移方程.
-
有了状态转移方程后,我们就可以开开心心写代码了.但是基于第一点,我们的字符串s必须是两个以上的,相信你也明白,所以我们就需要将1个字符和2个字符独立去考虑.
以上思路总结就是:
首先单独考虑长度为1和2的字符串,然后根据状态转移方程确定s里面的最长的回文字符串,将其输出来.
如果你明白且清楚的话,请开始你的代码之旅吧!!!
代码奉上
class Solution {
public:
string longestPalindrome(string s) {
int n=s.size();
vector<vector<int>> dp(n,vector<int>(n));
string ans;
int l;
for(l=0;l<n;l++)
{
for(int i=0;i+l<n;i++)
{
int j=i+l;
if(l==0)//长度为1的字符串
dp[i][j]=1;
else if(l==1)//长度为2的字符串
dp[i][j]=(s[i]==s[j]);
else
dp[i][j]=(dp[i+1][j-1] && s[i]==s[j]);
if(dp[i][j]&& 1+l>ans.size())
ans=s.substr(i,1+l);//输出回文字符串
}
}
return ans;
}
};
温馨提示:如果你不明白substr,请百度或者帮助文档API里面查!!(如果需要API,我将发上去免费!!!)
复杂度解析
时间复杂度:O(n^2),其中 n是字符串的长度。循环了两次。
空间复杂度:O(n^2),即存储动态规划状态需要的空间。
闲话时刻
昨天是个孤独的一天,凌晨出的题目,这不早上就写了今天的题解!!!哈哈哈哈哈哈
考试周了.真的不喜欢在家里上课.
你好,我是大一小菜鸡(又菜瘾还大)