解释:
求一个长度不超过1000的字符串中的最长回文子串。
思路:
利用动态规划求解,时间与空间复杂度都为O(n^2)。
table[i][j]为1表示字符串中从第i到第j的子串位回文串,否则不是。
初始条件:
对角线上的元素都为1,原因是是有一个字符,自己与自己回文。
若table[i+1][j-1]为回文串,并且s[i] == s[j](s为输入字符串),则table[i][j]也为回文串。
注意题目要求,有长度相等的回文子串时返回起始字符下标最小的字符串。
class Solution {
public:
string longestPalindrome(string s) {
int n = s.length();
int table[s.length()][s.length()] = {false};
int starti = 0;
int endj = 0;
for(int i = 0; i < n; i++)
table[i][i] = true;
for(int i = 0; i < n -1 ; i++)
if(s[i] == s[i+1])
{
table[i][i+1] = 1;
starti = i;
endj = i+1;
}
for(int len = 2; len < n; len++)
for(int i = 0; i < n- len; i++)
{
if( table[i+1][i+len-1] && s[i] == s[i+len])
{
table[i][i+len] = 1;
if(len > endj-starti)
{
endj = i+len;
starti = i;
}
}
}
return s.substr(starti,endj-starti+1);
}
};