题解 | #编号子回文II#
题目考察的知识点
-
回文子序列:需要理解什么是回文子序列,即从原序列中删除若干个字符(也可以不删除)得到的序列,且序列正读反读都一样。
-
动态规划:解题方法使用了动态规划的思想。动态规划是一种将复杂问题分解为更小的子问题,通过存储子问题的解来避免重复计算的方法。
题目解答方法的文字分析
-
首先,我们定义一个二维数组dp,大小为n * n,表示原序列子串[i, j]之间的最长回文子序列的长度。
-
初始化对角线上的dp[i][i]为1,表示单个字符的回文子序列长度为1。
-
通过两层循环遍历所有的子串,外层循环i从n-1到0,内层循环j从i+1到n-1。
-
如果s.charAt(i)等于s.charAt(j),说明当前字符可以构成回文子序列的两个相邻字符,因此dp[i][j]的长度是dp[i+1][j-1]的长度加2。
-
如果s.charAt(i)不等于s.charAt(j),说明当前字符无法和其他字符构成相邻的回文子序列,所以dp[i][j]的长度是dp[i+1][j]和dp[i][j-1]中的最大值。
-
最终,dp[0][n-1]即为原序列的最长回文子序列的长度。
本题解析所用的编程语言
解析使用的编程语言是JavaScript。JavaScript是一种通用的脚本语言,广泛应用于前端开发和后端开发。
完整且正确的编程代码
function longestPalindromeSubseq(s) {
const n = s.length;
const dp = Array.from(Array(n), () => Array(n).fill(0));
for (let i = 0; i < n; i++) {
dp[i][i] = 1;
}
for (let i = n - 1; i >= 0; i--) {
for (let j = i + 1; j < n; j++) {
if (s.charAt(i) === s.charAt(j)) {
dp[i][j] = dp[i + 1][j - 1] + 2;
} else {
dp[i][j] = Math.max(dp[i + 1][j], dp[i][j - 1]);
}
}
}
return dp[0][n - 1];
}
题解 | 前端刷题 文章被收录于专栏
题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码


