题解 | #编号子回文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。
这段代码考察的知识点主要包括:
- 字符串处理:利用字符串的方法和索引操作。
- 二维动态规划:使用二维数组dp来记录回文子序列的长度。
- 循环和条件语句:使用for循环和if条件语句进行遍历和判断。
- 数组和变量:使用数组和变量来存储回文子序列的长度。
该代码的详细解释大纲如下:
- 声明一个Solution类,其中包含一个方法longestPalindromeSubseq,用于找到给定字符串中最长回文子序列的长度。
- 方法参数为一个字符串s。
- 获取字符串s的长度n,并声明一个二维数组dp,用于保存状态转移的结果。
- 初始化dp数组的对角线元素,即单个字符本身是一个回文子序列,所以将对角线上的元素置为1。
- 通过遍历顺序从下到上、从左到右计算每个子问题的解。
- 在每个位置(i, j)上,比较s的第i个字符和第j个字符:如果两个字符相等,则当前子序列可以在两端增加相同字符来构成更长的回文子序列,所以dp[i][j]的值等于dp[i+1][j-1]+2。如果两个字符不相等,则需要分别考虑去掉第i个字符和去掉第j个字符的情况,取两种情况下回文子序列的最大长度作为dp[i][j]的值。
- 最终返回dp[0][n-1],即整个字符串s的最长回文子序列的长度。