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

【Leetcode 每日一题】132. 分割回文串 II

问题背景

给你一个字符串 s s s,请你将 s s s 分割成一些子串,使每个子串都是回文串。
返回符合要求的 最少分割次数

数据约束

  • 1 ≤ s . l e n g t h ≤ 2000 1 \le s.length \le 2000 1s.length2000
  • s s s 仅由小写英文字母组成

解题过程

一开始的想法是在 分割回文串 的基础上加一个计算列表长度最大值,然后就遇到了少见的空间不足。
实际上判断回文和计算最少分割次数,都可以用动态规划的思想来考虑,两个过程都会涉及到大量的重复计算,不做记忆化肯定是会出问题的。

具体实现

class Solution {
    public int minCut(String s) {
        char[]  chS = s.toCharArray();
        int n = chS.length;
        int[][] palMemo = new int[n][n];
        for (int[] row : palMemo) {
            Arrays.fill(row, -1);
        }
        int[] dfsMemo = new int[n];
        Arrays.fill(dfsMemo, -1);
        return dfs(n - 1, chS, palMemo, dfsMemo);
    }

    private int dfs(int right, char[] chS, int[][] palMemo, int[] dfsMemo) {
        if (isPalindrome(0, right, chS, palMemo)) {
            return 0;
        }
        if (dfsMemo[right] != -1) {
            return dfsMemo[right];
        }
        int res = Integer.MAX_VALUE;
        for (int left = 1; left <= right; left++) {
            if (isPalindrome(left, right, chS, palMemo)) {
                res = Math.min(res, dfs(left - 1, chS, palMemo, dfsMemo) + 1);
            }
        }
        return dfsMemo[right] = res;
    }

    private boolean isPalindrome(int left, int right, char[] chS, int[][] palMemo) {
        if (left >= right) {
            return true;
        }
        if (palMemo[left][right] != -1) {
            return palMemo[left][right] == 1;
        }
        boolean res = chS[left] == chS[right] && isPalindrome(left + 1, right - 1, chS, palMemo);
        palMemo[left][right] = res ? 1 : 0;
        return res;
    }
}

相关文章:

  • Linux篇——工具
  • 每天一个Flutter开发小项目 (9) : Flutter状态管理进阶 - Provider构建你的简易购物车应用
  • ViewPager2跟ViewPager的区别
  • 基于单片机的智能扫地机器人
  • 完美解锁便捷版!
  • Linux:文件系统
  • 【Linux网络#10】:Https协议原理
  • hatitat-sim的agent.py各部分组成
  • 深入理解推理语言模型(RLM)
  • 【Linux】进程替换(七)
  • 微信小程序点击按钮,将图片下载到本地
  • [Computer Vision]实验六:视差估计
  • 使用haproxy实现MySQL服务器负载均衡
  • js 之 lodash函数库 的下载与基础使用
  • 企微审批中MySQL字段TEXT类型被截断的排查与修复实践
  • C++ 的 if 判断语句教程
  • 2025年AI网络安全攻防战:挑战深度解析与全链路防御体系构建指南
  • springboot项目Maven打包遇到的问题总结
  • C++ 二叉树代码
  • 机器分类的基石:逻辑回归Logistic Regression
  • 广西百色“致富果”:高品质芒果直供香港,带动近五千户增收
  • 征稿启事|澎湃·镜相第三届非虚构写作大赛暨2026第六届七猫现实题材征文大赛
  • 明查| 新一代AI诊疗系统可3秒筛查13种癌症?没有证据
  • 普京批准俄方与乌克兰谈判代表团人员名单
  • 生态环境保护督察工作条例对督察对象和内容作了哪些规定?有关负责人答问
  • 牟海松任国家信访局副局长