当前位置: 首页 > news >正文

代码随想录Day46 | 647.回文子串,516.最长回文子序列

代码随想录Day46 | 647.回文子串,516.最长回文子序列

647.回文子串

  1. dp[i][j]定义:

    与其他动态规划题目不同,一般题目求什么,dp就定义为什么

    这道题的dp定义为区间范围[i,j]的子串是否是回文子串

  2. 需要注意遍历顺序

    需要用到dp[i + 1][j - 1],即左下角元素

    且根据定义,j >= i

  3. 状态转移:

    • 元素相等时
      • 长度 <= 2,一定是回文,如 aa, a
      • 长度 > 2时,若 [i+1, j-1] 范围,即除头尾元素外的内部子串为回文,则回文
    • 元素不相等,则默认false
class Solution {
    public int countSubstrings(String s) {
        char[] chars = s.toCharArray();
        int n = s.length();
        // 定义:区间范围[i,j]的子串是否是回文子串
        boolean[][] dp = new boolean[n][n];
        int res = 0;

        // 需要用到dp[i + 1][j - 1],即左下角元素,注意遍历顺序
        for (int i = n - 1; i >= 0; i--) {
            // j >= i
            for (int j = i; j < n; j++) {
                // 状态转移:
                // 元素相等时
                if (chars[i] == chars[j]) {
                    // 长度 <= 2,一定是回文,如 aa, a
                    if (j - i <= 1) {
                        res++;
                        dp[i][j] = true;
                    }
                    // 长度 > 2时
                    // 若 [i+1, j-1] 范围,即除头尾元素外的内部子串为回文,则回文
                    else if (dp[i + 1][j - 1]) {
                        res++;
                        dp[i][j] = true;
                    }
                }
                // 元素不相等,则默认false
            }
        }

        return res;
    }
}

516.最长回文子序列

dp[i][j]定义:

回文问题,定义为s在[i,j]索引范围内的回文子序列个数

初始化:

单个字符时,是回文串

状态转移:

  • 字符不匹配时,dp[i][j] = Math.max(dp[i+1][j], dp[i][j-1])取最大值
  • 字符匹配时,dp[i][j] = dp[i+1][j-1] + 2长度加2
class Solution {
    public int longestPalindromeSubseq(String s) {
        int len = s.length();
        char[] chars = s.toCharArray();
        // dp[i][j]定义:
        // s在[i,j]索引范围内的回文子序列个数
        int[][] dp = new int[len][len];

        for (int i = len - 1; i >= 0; i--) {
            // 初始化
            dp[i][i] = 1;
            for (int j = i + 1; j < len; j++) {
                // 状态转移:字符相等与不相等情况
                if (chars[i] == chars[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][len-1];
    }
}

相关文章:

  • CI/CD的定义
  • Docker 部署 Jenkins持续集成(CI)工具
  • 20250224-代码笔记02-class CVRPTrainer
  • 谈谈 ES 6.8 到 7.10 的功能变迁(3)- 查询方法篇
  • 开源神器KRR:用数据驱动K8s资源优化
  • 【C】堆的应用1 -- 堆排序
  • ubuntu安装配置docker
  • 《数据库索引设计与优化》译本错误纠正(1)
  • C++类和对象(中)
  • Ocelot 请求聚合
  • 【JavaScript】什么是JavaScript?以及常见的概念
  • jupyterhub on k8s 配置用户名密码 简单版
  • C++ day4 练习
  • SQL: DDL,DML,DCL,DTL,TCL,
  • 2.24力扣每日一题--设计有序流
  • 【Microsoft® PowerPoint for Mac】MAC一键导出PPT备注
  • 能不能用Ai来开发出一款APP?很早就想过能不能用Ai来开发出一款APP?
  • 89.迷人子序列计数问题|Marscode AI刷题
  • vue2中,打包报错ERROR in /node_modlules/@types/lodash/common/common.d.ts 26
  • python全栈-并发和网络通信
  • 红星控股:车建兴已授权其配偶作为代理人,将全力以赴配合推进重整程序
  • 腾讯布局智能体开发平台,吴运声:智能体行业增长很快,仍处于百花齐放阶段
  • “阳光下的守护”法治公安主题宣传活动在京启动:突出为民服务宣传
  • 英欧再“牵手”,友好“靠美国”
  • 冒充现役军人、自称有中国兵工集团投资内幕,2人被刑拘
  • 韩国第二大轮胎制造商因火灾停产,或影响700万条轮胎销售