当前位置: 首页 > 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;
    }
}
http://www.dtcms.com/a/47246.html

相关文章:

  • 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
  • React Portals深度解析:突破组件层级的渲染艺术
  • 计算机毕业设计SpringBoot+Vue.js景区民宿预约系统(源码+文档+PPT+讲解)
  • 原生AJAX和jQuery的Ajax区别
  • xss自动化扫描工具-DALFox
  • Linux:程序翻译
  • 常见报错及解决方案
  • 自然语言处理:文本表示
  • Android应用开发面试题
  • 深度解析Ant Design Pro 6开发实践
  • Flink怎么搞CDC?