题意:寻找最长的回文字符串
分析:使用动态规划,维护一张表table[i][j],i表示左边界,j表示右边界,table的值表示i倒j范围内的值是否是回文字符串,时间复杂度O(n^2),空间O(n^2),动态规划方程如下:
- dp[i][j] 表示子串s[i…j]是否是回文
- 初始化:dp[i][i] = true (0 <= i <= n-1); dp[i][i-1] = true (1 <= i <= n-1); 其余的初始化为false
- dp[i][j] = (s[i] == s[j] && dp[i+1][j-1] == true)
class Solution {
public:
string longestPalindrome(string s) {
const int a=s.size();
int maxlen=1;
int begin=0;
bool table[1000][1000]={false};
for(int i=0;i<a;i++){
table[i][i]=true;
}
for(int i=0;i<a-1;i++){
if(s[i]==s[i+1]){
table[i][i+1]=true;
begin=i;
maxlen=2;
}
}
for(int len=3;len<=a;len++){
for(int i=0;i<a-len+1;i++){
int j=len+i-1;
if(s[i]==s[j]&&table[i+1][j-1]){
table[i][j]=true;
begin=i;
maxlen=len;
}
}
}
return s.substr(begin,maxlen);
}
};