import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
String s = in.next();
System.out.println(longestPalindromeSubseq(s));
}
public static int longestPalindromeSubseq(String s) {
int n = s.length();
int[][] dp = new int[n][n];
for (int i = n - 1; i >= 0; i--) {
dp[i][i] = 1;
for (int 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];
}
}
https://www.nowcoder.com/discuss/727521113110073344
思路:
输入处理:使用 Scanner 读取输入的字符串。
动态规划数组初始化:二维数组 dp 用于存储子问题的结果,其中 dp[i][i] 初始化为1,因为单个字符本身就是一个回文。
填充动态规划数组:从字符串的末尾开始遍历,确保在计算当前子问题时,所有子子问题已经解决。对于每个字符对 (i, j),根据字符是否相等来更新 dp 数组。
返回结果:最终结果存储在 dp[0][n-1] 中,表示整个字符串的最长回文子序列长度。



京公网安备 11010502036488号