题解 | #编号子回文II#
编号子回文II
https://www.nowcoder.com/practice/62e2d96d7b534d22a9b754005a4138a5
考察的知识点:动态规划;
解答方法分析:
- 定义一个二维数组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];
}
};
查看1道真题和解析