考察的知识点:动态规划;
解答方法分析:
- 定义一个二维数组dp,其中dp[i][j]表示从字符串s的第i个字符到第j个字符之间的最长回文子序列的长度。
- 对于长度为1的子序列,dp[i][i]的值都为1。
- 根据子序列的长度逐步增加,对于长度为len的子序列,遍历所有起始位置i,计算dp[i][i+len-1]的值。
- 如果s[i]等于s[i+len-1],则dp[i][i+len-1]的值等于dp[i+1][i+len-2]的值上2,即字符串s的第i+1个字符到第i+len-2个字符之间的最长回文子序列的长度加上2如果s[i]不等于s[i+len-1],则dp[i][i+len-1]的值等于dp[i+1][i+len-1]和dp[i][i+len-2]中的较大值。
- 返回dp[0][n-1]。
所用编程语言:C++;
完整编程代码:↓
class Solution { public: /** * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可 * * * @param s string字符串 * @return int整型 */ int longestPalindromeSubseq(string s) { int n = s.length(); vector<vector<int>> dp(n, vector<int>(n, 0)); for (int i = 0; i < n; i++) { dp[i][i] = 1; } for (int len = 2; len <= n; len++) { for (int i = 0; i <= n - len; i++) { int j = i + len - 1; if (s[i] == s[j]) { dp[i][j] = dp[i + 1][j - 1] + 2; } else { dp[i][j] = max(dp[i + 1][j], dp[i][j - 1]); } } } return dp[0][n - 1]; } };