题解 | #编号子回文II#

题目考察的知识点

  1. 回文子序列:需要理解什么是回文子序列,即从原序列中删除若干个字符(也可以不删除)得到的序列,且序列正读反读都一样。

  2. 动态规划:解题方法使用了动态规划的思想。动态规划是一种将复杂问题分解为更小的子问题,通过存储子问题的解来避免重复计算的方法。

题目解答方法的文字分析

  1. 首先,我们定义一个二维数组dp,大小为n * n,表示原序列子串[i, j]之间的最长回文子序列的长度。

  2. 初始化对角线上的dp[i][i]为1,表示单个字符的回文子序列长度为1。

  3. 通过两层循环遍历所有的子串,外层循环i从n-1到0,内层循环j从i+1到n-1。

  4. 如果s.charAt(i)等于s.charAt(j),说明当前字符可以构成回文子序列的两个相邻字符,因此dp[i][j]的长度是dp[i+1][j-1]的长度加2。

  5. 如果s.charAt(i)不等于s.charAt(j),说明当前字符无法和其他字符构成相邻的回文子序列,所以dp[i][j]的长度是dp[i+1][j]和dp[i][j-1]中的最大值。

  6. 最终,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];
}
题解 | 前端刷题 文章被收录于专栏

题目考察的知识点 题目解答方法的文字分析 本题解析所用的编程语言 完整且正确的编程代码

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务