传送门:https://leetcode-cn.com/problems/longest-palindromic-substring/
dp[i][j]: 长度大于3的情况:i表示左边界,j表示右边界 如果dp[i+1][j-1]符合要求切s[i] == s[j]的话,那么i到j的字符串就满足要求
长度小于3的情况: s[i] == s[j] and j - i < 3;
状态转移方程:dp[i][j] = (s[i] == s[j]) and (j - i < 3 or dp[i+1][j-1] )
class Solution {
public:
string longestPalindrome(string s) {
if(s.size() < 2) return s;
else{
int n = s.size();
int begin = 0; //起始下标
int length = 1; //起始长度
vector<vector<int>> dp(n,vector<int>(n)); //vector二维数组
for(int i = 0 ; i < n ; i++) dp[i][i] = true; //表示长度为1的回文子串
for(int l = 2; l <= n; l++){ //枚举长度
for(int i = 0; i < n; i++){
int j = i + l - 1; //表示右边界
if(j >= n) break;
if(s[i] == s[j]){
if(j - i < 3) dp[i][j] = true; //长度为2、3的字串符合回文子串
else dp[i][j] = dp[i+1][j-1]; // 长度大于3的字串用该动态转移方程判断
}
else dp[i][j] = false;
if(dp[i][j] && j - i + 1 > length){ //记录长度最长时的起始下标与长度输出
length = j - i + 1;
begin = i;
}
}
}
return s.substr(begin,length);
}
}
};