动态规划
Class Solution {
public:
string longestPalindrome(string s) {
//n为输入的String长度
int n = s.size();
//特殊情况
if(n < 2) return s;
int maxLen = 1;
int begin = 0;
//dp是一个n行n列的数组
vector<vector<int>> dp(n,vector<int>(n));
for(int i=0;i<n;i++){
//长度是1的都回文
dp[i][i] = true;
}
//回文长度L
for(int L=2;L<=n;L++){
//左边界i
for(int i=0;i<n;i++){
//右边界j
int j = L+i-1;
//j越界
if(j>=n){
break;
}
if(s[i] != s[j]){
dp[i][j] = false;
}else{
//s[i]==s[j]
if(j-i<3){
dp[i][j] = true;
}else{
//长度大于2,外面一层等于里面一层判断
//意思是:比如aa或a是true。那么baab或bab则根据aa或a置为true
//由中间向外扩散true
dp[i][j] = dp[i+1][j-1];
}
}
//判断长度是否比当前最大的大
if(dp[i][j] && j-i+1>maxLen){
maxLen = j-i+1;
begin = i;
}
}
}
return s.substr(begin,maxLen);
}
};
时间复杂度:O(n^2)
空间复杂度:O(n^2),即存储动态规划状态需要的空间。