题解 | #编号子回文II# java

编号子回文II

https://www.nowcoder.com/practice/62e2d96d7b534d22a9b754005a4138a5

import java.util.*;


public class Solution {
    /**
     * 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
     *
     *
     * @param s string字符串
     * @return int整型
     */
    public int longestPalindromeSubseq (String s) {
        // write code here
        int n = s.length();
        int[][] dp = new int[n][n];

        // 初始化对角线元素为1,单个字符本身就是一个回文子序列
        for (int i = 0; i < n; i++) {
            dp[i][i] = 1;
        }

        // 从下到上、从左到右遍历矩阵,计算每个子问题的解
        for (int i = n - 1; i >= 0; i--) {
            for (int j = i + 1; j < n; j++) {
                if (s.charAt(i) == s.charAt(j)) {
                    // 如果当前字符相等,可以直接在两端增加字符,长度加2
                    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];
    }
}

该代码使用的编程语言是Java。

这段代码考察的知识点主要包括:

  1. 字符串处理:利用字符串的方法和索引操作。
  2. 二维动态规划:使用二维数组dp来记录回文子序列的长度。
  3. 循环和条件语句:使用for循环和if条件语句进行遍历和判断。
  4. 数组和变量:使用数组和变量来存储回文子序列的长度。

该代码的详细解释大纲如下:

  1. 声明一个Solution类,其中包含一个方法longestPalindromeSubseq,用于找到给定字符串中最长回文子序列的长度。
  2. 方法参数为一个字符串s。
  3. 获取字符串s的长度n,并声明一个二维数组dp,用于保存状态转移的结果。
  4. 初始化dp数组的对角线元素,即单个字符本身是一个回文子序列,所以将对角线上的元素置为1。
  5. 通过遍历顺序从下到上、从左到右计算每个子问题的解。
  6. 在每个位置(i, j)上,比较s的第i个字符和第j个字符:如果两个字符相等,则当前子序列可以在两端增加相同字符来构成更长的回文子序列,所以dp[i][j]的值等于dp[i+1][j-1]+2。如果两个字符不相等,则需要分别考虑去掉第i个字符和去掉第j个字符的情况,取两种情况下回文子序列的最大长度作为dp[i][j]的值。
  7. 最终返回dp[0][n-1],即整个字符串s的最长回文子序列的长度。
全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务