题目:求一个字符串s的最长回文子串
思路:动归解决,dp为一个二维数组,dp[i][j]表示s的第i到第j是否为回文串,若是则为长度此回文串长度(即i-j),若不是则为0
状态转移方程:
1.i=j则dp[i][j]=1
2.i=j-1则判断s[i]和s[j]是否相同,相同则dp[i][j]=2,否则dp[i][j]=0
3.i<j-1则判断s[i]和s[j]是否相同,且dp[i+1]dp[j-1]>0,若是则dp[i][j]=j - i,否则dp[i][j]=0
最后返回dp最大的值对应的那个子串
class Solution {
public:
string longestPalindrome(string s) {
int len = s.size(), maxi = 0, pos;
vector<vector<int> > dp(len, vector<int>(len, 0));
for (int l = 1; l <= len; ++l) {
for (int i = 0; i <= len - l; ++i) {
int j = i + l - 1;
if (i == j) dp[i][j] = 1;
else if (i == j - 1) {
if (s[i] == s[j]) dp[i][j] = 2;
else dp[i][j] = 0;
} else {
if (dp[i + 1][j - 1] > 0 && s[i] == s[j]) dp[i][j] = dp[i + 1][j - 1] + 2;
else dp[i][j] = 0;
}
if (dp[i][j] > maxi) {
maxi = dp[i][j];
pos = i;
}
}
}
return s.substr(pos, maxi);
}
};