动态规划
思路解读
深入理解题意,定义状态,找到状态转移方程。
- 状态定义
将 f ( i , j ) f(i, j) f(i,j),定义为从 i i i到 j j j的回文字符串。这点很重要,因为这是二维问题,需要用二维数组memo[i][j]
来实现。但分析代码时,不要试图利用二维数组理解memo[i][j]
- 状态转移方程
f ( i , j ) = { true, i = j s [ i ] = = s [ j ] , i = j − 1 s [ i ] = s [ j ] and f ( i + 1 , j − 1 ) , i < j − 1 f(i, j)=\left\{\begin{array}{l}{\text { true, } i=j} \\ {s[i]==s[j], \quad i=j-1} \\ {s[i]=s[j] \quad \text { and } \quad f(i+1, j-1), \quad i<j-1}\end{array}\right. f(i,j)=⎩⎨⎧ true, i=js[i]==s[j],i=j−1s[i]=s[j] and f(i+1,j−1),i<j−1
代码及解析
class Solution {
public:
string longestPalindrome(string s) {
const int N = s.size();
if (N < 2) {
return s;
}
bool memo[N][N] = {false};
int left = 0, right = 0;//memo[0][0] = true了。
for (int i = N - 2; i >= 0; --i)
for (int j = i + 1; j < N; ++j) {
memo[i][j] = ((s[i] == s[j]) && (j - i < 3 || memo[i + 1][j - 1]));
if (memo[i][j] && (j - i > right - left)) {
left = i;
right = j;
}
}
return s.substr(left, right - left + 1);
}
};