给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为1000。
示例 1:
输入: "babad" 输出: "bab" 注意: "aba"也是一个有效答案。
示例 2:
输入: "cbbd" 输出: "bb"
解法一:三重循环,暴力求解
class Solution {
public:
string longestPalindrome(string s) {
if(s.size()==1) return s;
int start = 0,maxlength = 1;
for(int i=0; i< s.size();i++){
for(int j=i+1;j < s.size();j++){
int temp1,temp2;
for(temp1 = i,temp2 = j;temp1<temp2;temp1++,temp2--){
if(s[temp1] != s[temp2])
break;
}
if(temp1>=temp2 && j-i+1 > maxlength){
maxlength = j-i+1;
start = i;
}
}
}
string res = s.substr(start,maxlength);
return res;
}
};
解法二:动态规划方法,
对于字符串str,假设dp[i,j]=1表示str[i...j]是回文子串,那个必定存在dp[i+1,j-1]=1。这样最长回文子串就能分解成一系列子问题,可以利用动态规划求解了。首先构造状态转移方程
上面的状态转移方程表示,当str[i]=str[j]时,如果str[i+1...j-1]是回文串,则str[i...j]也是回文串;如果str[i+1...j-1]不是回文串,则str[i...j]不是回文串。
初始状态
- dp[i][i]=1
- dp[i][i+1]=1 if str[i]==str[i+1]
上式的意义是单个字符,两个相同字符都是回文串。(来源于https://www.cnblogs.com/mini-coconut/p/9074315.html)
string longestPalindrome(string s)
{
if (s.empty()) return "";
int len = s.size();
if (len == 1)return s;
int longest = 1;
int start=0;
vector<vector<int> > dp(len,vector<int>(len));
for (int i = 0; i < len; i++)
{
dp[i][i] = 1;
if(i<len-1)
{
if (s[i] == s[i + 1])
{
dp[i][i + 1] = 1;
start=i;
longest=2;
}
}
}
for (int l = 3; l <= len; l++)//子串长度
{
for (int i = 0; i+l-1 < len; i++)//枚举子串的起始点
{
int j=l+i-1;//终点
if (s[i] == s[j] && dp[i+1][j-1]==1)
{
dp[i][j] = 1;
start=i;
longest = l;
}
}
}
return s.substr(start,longest);
}