最近在做动态规划的题 熟悉之后后面再做一个系统总结吧
#include<iostream>
using namespace std;
class Solution {
public:
string longestPalindrome(string s) {
int n = s.size();
if (n < 2) {
return s;
}//如果这个字符串小于2那他本身就是自己的最大回文
int maxLen=1;
int begin = 0;
vector<vector<int>> dp(n, vector<int>(n));// dp[i][j] 表示 s[i..j] 是否是回文串sj表示左右边界
for (int i = 0; i < n; i++) {
dp[i][i] = true;//左右边界相等则是回文子串
}
for(int L=2;L<=n;L++){
for(int i=0;i<n;i++){
// j-i+1=L 右边界减去左边界+1=长度
int j=L+i-1;
if (j >= n) {
break;
}
if(s[i]!=s[j])//如果左右边界上的元素不相等那么就不是回文串 那么这个字串就不是回文子串
{
dp[i][j]=false;
}else {//左右边界相等时
if(j-i<3){//如果子串的左右边界差值小于3那么他就是真的
dp[i][j]=true;
}else{
dp[i][j]=dp[i+1][j-1];//如果他是一个回文那么收紧之后左右边界减1也应是回串
}
}
if(dp[i][j]==true&&j-i+1>maxLen){//如果是回文串并且 这个回文子串的长度大于之前的最大长度L=j-i+1>maxLen
maxLen=j-i+1;//那么最大长度L=j-i+1
begin=i;
}
}
}
return s.substr(begin, maxLen);
}
};