题目要求
解题思路
这一类型(回文子串)主要有两种解决方法,一种是动态规划,另一种是中心拓展算法。
动态规划:
本质问题就是在i-j区间是不是回文的。这样的话我们在 i 和 j 位置的值相等时,判断如下三种情况即可:
1. i == j 时肯定是回文的
2. i + 1 == j 时也肯定是回文的
3. i + 1 < j 时,那就需要判断 i + 1 到 j - 1 位置是否是回文的即可
中心拓展算法:
本质就是利用字串的特性进行暴力枚举,我们分别枚举每一个位置的值,分别判断奇数个数据和偶数个数据时情况即可。
解题代码
class Solution
{
public:
string longestPalindrome(string s)
{
//动态规划
//1.创建dp表
//2.初始化
//3.填表
//4.返回值
int n=s.size();
vector<vector<bool>> dp(n,vector<bool>(n));
int len=1,begin=0;
//填表顺序从下往上
for(int i=n-1;i>=0;i--)
{
for(int j=i;j<n;j++)
{
if(s[i]==s[j])
dp[i][j]=i+1<j?dp[i+1][j-1]:true;
//处理返回值
if(dp[i][j]&&j+1-i>len)
{
len=j+1-i;
begin=i;
}
}
}
return s.substr(begin,len);
}
};
class Solution
{
public:
string longestPalindrome(string s)
{
int n=s.size(),len=1,begin=0;
//中心扩展
for(int i=0;i<n;i++)
{
//奇数
int left=i,right=i;
while(left>=0&&right<n&&s[left]==s[right])
{
left--;
right++;
}
if(right-left-1>len)
{
begin=left+1;
len=right-left-1;
}
//偶数
left=i,right=i+1;
while(left>=0&&right<n&&s[left]==s[right])
{
left--;
right++;
}
if(right-left-1>len)
{
begin=left+1;
len=right-left-1;
}
}
return s.substr(begin,len);
}
};