题目描述:
给你一个字符串 s,找到 s 中最长的回文子串。
示例:
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”
示例 3:
输入:s = “a”
输出:“a”
示例 4:
输入:s = “ac”
输出:“a”
解析:
这题从直观观感来看,似乎跟之前一题求区间最大值类似,似乎可以用滑动窗口可解,当然这可行,不过效率不高。
分析回文定义,如果一个字符串s[l][r]是回文字符串,则它的子字符串s[l+1][r-1]也应该是回文字符串。因此理所当然可以靠动态规划实现。
class solution
{
public:
string longestPalindrome(string s)
{
//空字符串或字符串长度为1
if(s.length()<2)
{
return s;
}
int length = s.length(); //字符串长度
int max_length = 1; //最大长度
int start = 0; //子字符串开始位置
//标记子字符串是否为回文
int flag[1005][1005] = { 0 };
for(int r=1;r<length;r++)
{
for(int l=0;l<r;l++)
{
//两字符需相同
//单字符或aa类型字符串
//前序子字符串也为回文
if(s[l]==s[r]&&(r-l<=2||flag[l+1][r-1]))
{
flag[l][r] = 1;
//新回文长度
int new_length = r - l + 1;
if(new_length>max_length)
{
max_length = new_length;
start = l;
}
}
}
}
return s.substr(start, max_length);
}
};