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

【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;
    }
}

http://www.kler.cn/a/569408.html

相关文章:

  • 重新审视 ChatGPT 和 Elasticsearch:第 2 部分 - UI 保持不变
  • c# winfrom增加进度条
  • WP 高级摘要插件:助力 WordPress 文章摘要精准自定义显示
  • Python Cookbook-2.13 使用C++的类iostream语法
  • 解决 Dell PowerEdge T630 增加第三方 PCIe 设备后制冷系统异常
  • 【深度学习】Hopfield网络:模拟联想记忆
  • JAVA调用Deepseek的api,完成基本对话
  • HTML AI 编程助手
  • Spring系列学习之Spring Messaging消息支持
  • 基于FD-MIMO技术的雷达通信一体化系统波形设计matlab模拟与仿真
  • Android应用app实现AI电话机器人接打电话
  • 如何在netlify一键部署静态网站
  • 【极客时间】浏览器工作原理与实践-2 宏观视角下的浏览器 (6讲) - 2.3 HTTP请求流程:为什么很多站点第二次打开速度会很快?
  • Python Tornado 框架面试题及参考答案
  • 计算机毕业设计Hadoop+Spark+DeepSeek-R1大模型音乐推荐系统 音乐数据分析 音乐可视化 音乐爬虫 知识图谱 大数据毕业设计
  • 视觉图像坐标转换
  • P8680 [蓝桥杯 2019 省 B] 特别数的和
  • 测试用例详解
  • 基于springboot的文旅网站系统的设计与实现
  • Linux mkdir 命令