题目大意
给定一个字符串,求它最长的回文子串,子串意味着要在给定的字符串中连续,回文则要左右对称。
分析
设dp[i][j]为s[i][j]是否为i最长回文子串,那么很容易得到s[i][i],s[i][i+1]的情况,接下来进行递推计算长度大于等于3的回文子串:
当s[i] = s[i + len - 1]且dp[i + 1][i + len - 2]=true的时候,dp[i][i + len - 1]=true。
代码
bool dp[1005][1005];
string longestPalindrome(string s) {
memset(dp, false, sizeof(dp));
int len = s.length(), start = 0, length = 1;
for(int i = 0; i < len; i++) {
dp[i][i] = true;
}
for(int i = 0; i < len - 1; i++) {
if(s[i] == s[i + 1]) {
dp[i][i + 1] = true;
start = i;
length = 2;
} else {
dp[i][i + 1] = false;
}
}
for(int l = 3; l <= len; l++) {
for(int i = 0; i + l - 1 < len; i++) {
if(s[i] == s[i + l - 1] && dp[i + 1][i + l - 2]) {
dp[i][i + l - 1] = true;
start = i;
length = l;
} else {
dp[i][i + l - 1] = false;
}
}
}
return s.substr(start, length);
}