题目要求
解题思路
这一类型(回文子串)主要有两种解决方法,一种是动态规划,另一种是中心拓展算法。
动态规划:
本质问题就是在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);}
};