classSolution { public: intlongestPalindromeSubseq(string s){ int n = s.length(); vector<vector<int>> f(n, vector<int>(n)); for (int i = 0; i < n; ++i) { f[i][i] = 1; } for (int i = 0; i < n - 1; ++i) { f[i][i + 1] = (s[i] == s[i + 1]) + 1; } for (int len = 2; len < n; ++len) { for (int i = 0, j = i + len; i < n && j < n; ++i, ++j) { if (s[i] == s[j]) { f[i][j] = 2 + f[i + 1][j - 1]; } else { f[i][j] = max(f[i][j - 1], f[i + 1][j]); } } } return f[0][n - 1]; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intlongestPalindromeSubseq(string s){ int n = s.size(); vector<vector<int>> dp(n, vector<int>(n)); for (int i = 0; i < n; ++i) { dp[i][i] = 1; for (int j = i - 1; j >= 0; --j) { if (s[i] == s[j]) { dp[j][i] = dp[j + 1][i - 1] + 2; } else { dp[j][i] = max(dp[j + 1][i], dp[j][i - 1]); } } } return dp[0][n - 1]; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
classSolution { public: intlongestPalindromeSubseq(string s){ int n = s.size(), res = 0; vector<int> dp(n, 1); // dp[i]表示以s[i]为止的最长回文子序列的长度 for (int i = n - 1; i >= 0; --i) { int len = 0; // len是s[i:j]两边exclusive(即s[i + 1 : j - 1])之内的最长回文子序列的长度 for (int j = i + 1; j < n; ++j) { int t = dp[j]; // 保存s[i + 1 : j]两边inclusive的最长回文子序列的长度 if (s[i] == s[j]) { dp[j] = len + 2; } len = max(len, t); } } for (int num : dp) res = max(res, num); return res; } };
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
classSolution { public: intlongestPalindromeSubseq(string s){ int n = s.size(); vector<vector<int>> dp(n, vector<int>(n)); for (int i = n - 1; i >= 0; --i) { dp[i][i] = 1; for (int j = i + 1; j < n; ++j) { if (s[i] == s[j]) { dp[i][j] = dp[i + 1][j - 1] + 2; // 如果j = i + 1则j - 1 < i + 1则dp[i + 1][j - 1]为0 } else { dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); } } } return dp[0][n - 1]; } };