给定一个字符串 s,找到 s 中最长的回文子串。你可以假设 s 的最大长度为 1000。
示例 1:
输入: "babad"
输出: "bab"
注意: "aba" 也是一个有效答案。
/*动态规划的核心是找到状态转移公式,这道题的状态转移明显是若一个子串是回文子串
且这个子串的前一个字符与后一个字符相同,则回文子串长度加2;
想办法表示一个状态:isPalindrome[i][j]=true表示下标从i到j的子串是回文子串*/
string longestPalindrome(string s) {
int n=s.size();
bool **isPalindrome=new bool*[n];
for(int i=0;i<n;++i){
isPalindrome[i]=new bool[n];
memset(isPalindrome[i],0,n);
}
int start=0,maxLength=1;
for(int j=0;j<n;++j){
for(int i=0;i<=j;++i){
if(j-i<2) isPalindrome[i][j]=(s[i]==s[j]);
else {
isPalindrome[i][j]=(s[i]==s[j]&&isPalindrome[i+1][j-1]);
}
if(isPalindrome[i][j]==true&&j-i+1>maxLength) {
start=i;
maxLength=j-i+1;
}
}
}
return s.substr(start,maxLength);
}