(动态规划) 132. 分割回文串 II ——【Leetcode每日一题】

news2024/9/28 1:16:53

❓ 132. 分割回文串 II

难度:困难

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文。

返回符合要求的 最少分割次数

示例 1:

输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。

示例 2:

输入:s = “a”
输出:0

示例 3:

输入:s = “ab”
输出:1

提示

  • 1 < = s . l e n g t h < = 2000 1 <= s.length <= 2000 1<=s.length<=2000
  • s 仅由小写英文字母组成

💡思路:动态规划

  1. 定义一个二维数组 isPalindromic[i][j],记录 [i, j] 是不是回文子串
    • 该二维数组从右下角开始遍历,如果 s[i] == s[j] 则判断 j - i <= 1 或者 判断内部 isPalindromic[i + 1][j - 1] 是否是回文字符串
      在这里插入图片描述
  2. 定义一维 dp 数组, dp[i] 表示使范围是 [0, i] 的子串分割成回文串,最少分割次数是 dp[i]:
    • 如果要对长度为 [0, i] 的子串进行分割,分割点为 j :
      • 如果分割后,区间 [j + 1, i] 是回文子串,那么 dp[i] 就等于 dp[j] + 1;
      • 我们要找做小分割数量所以递推公式为: d p [ i ] = m i n ( d p [ i ] , d p [ j ] + 1 ) dp[i] = min(dp[i], dp[j] + 1) dp[i]=min(dp[i],dp[j]+1)
  3. 最后 dp[n - 1] 即为 所求 最少分割次数。

🍁代码:(C++、Java)

C++

class Solution {
public:
    int minCut(string s) {
        int n = s.size();
        vector<vector<bool>> isPalindromic(n, vector<bool>(n, false));//二维数组,isPalindromic[i][j]表示[i, j]是不是回文子串
        for(int i = n - 1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(s[i] == s[j] && (j - i <= 1 || isPalindromic[i + 1][j - 1])){
                    isPalindromic[i][j] = true;
                }
            }
        }

        //初始化dp数组,dp[i]表示范围是[0, i]的回文子串,最少分割次数是dp[i]
        vector<int> dp(n);
        for(int i = 0; i < n; i++) dp[i] = i;
        for(int i = 1; i < n; i++){
            if(isPalindromic[0][i])
            {
                dp[i] = 0;
                continue;
            }
            for(int j = 0; j < i; j++){
                if(isPalindromic[j + 1][i]){
                    dp[i] = min(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[n - 1];
    }
};

Java

class Solution {
    public int minCut(String s) {
        int n = s.length();
        boolean[][] isPalindromic = new boolean[n][n];//二维数组,isPalindromic[i][j]表示[i, j]是不是回文子串
        for(int i = n - 1; i >= 0; i--){
            for(int j = i; j < n; j++){
                if(s.charAt(i) == s.charAt(j) && (j - i <= 1 || isPalindromic[i + 1][j - 1])){
                    isPalindromic[i][j] = true;
                }
            }
        }

        //初始化dp数组,dp[i]表示范围是[0, i]的回文子串,最少分割次数是dp[i]
        int[] dp = new int[n];
        for(int i = 0; i < n; i++) dp[i] = i;
        for(int i = 1; i < n; i++){
            if(isPalindromic[0][i])
            {
                dp[i] = 0;
                continue;
            }
            for(int j = 0; j < i; j++){
                if(isPalindromic[j + 1][i]){
                    dp[i] = Math.min(dp[i], dp[j] + 1);
                }
            }
        }
        return dp[n - 1];
    }
}

🚀 运行结果:

在这里插入图片描述

🕔 复杂度分析:

  • 时间复杂度 O ( n 2 ) O(n^2) O(n2),其中 n 为字符串 s 的长度。预处理计算 isPalindromic 和动态规划计算 dp 的时间复杂度均为 O ( n 2 ) O(n^2) O(n2)
  • 空间复杂度 O ( n 2 ) O(n^2) O(n2),数组isPalindromic 需要使用 O ( n 2 ) O(n^2) O(n2) 的空间, 数组 dp 需要使用 O ( n ) O(n) O(n) 的空间。

题目来源:力扣。

放弃一件事很容易,每天能坚持一件事一定很酷,一起每日一题吧!
关注我LeetCode主页 / CSDN—力扣专栏,每日更新!

注: 如有不足,欢迎指正!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/738054.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Vision Transformer (ViT)介绍

paper&#xff1a;An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale 摘要 把transformer直接应用于图像块序列&#xff0c;也可以在图像分类任务上表现很好。通过在大数据集上预训练&#xff0c;然后迁移到中等规模和小规模数据集上&#xff0c;…

Android之签字板

文章目录 前言一、效果图二、实现步骤1.GestureSignatureView类2.xml布局3.Activity类(kotlin)4.Activity类(Java)5.动态申请权限(kotlin)6.动态申请权限(Java) 总结 前言 随着公司发展需求&#xff0c;很多金融APP都会涉及到需要用户签字的环节&#xff0c;所以在此贴出代码以…

软考高级架构师笔记-9系统架构

目录 1. 前文回顾 & 考情分析2. 软件架构概述3. 软件架构风格3.1 层次架构风格3.2 面向服务架构风格4. 软件架构复用5. 特定领域软件体系结构DSSA6. ABSD7. 质量属性8. 架构评估9 结语1. 前文回顾 & 考情分析 前文回顾: 软考高级架构师笔记-1计算机硬件软考高级架构师…

TCP 协议(三)十种核心机制

1.确认应答&#xff08;可靠机制&#xff09; 2.超时重传&#xff08;可靠机制&#xff09; 3.连接管理&#xff08;可靠机制&#xff09; 4.滑动窗口&#xff08;效率机制&#xff09; 5.流量控制&#xff08;效率机制&#xff09; 6.拥塞控制&#xff08;效率机制&#xff09…

优维低代码实践:权限设置

优维低代码技术专栏&#xff0c;是一个全新的、技术为主的专栏&#xff0c;由优维技术委员会成员执笔&#xff0c;基于优维7年低代码技术研发及运维成果&#xff0c;主要介绍低代码相关的技术原理及架构逻辑&#xff0c;目的是给广大运维人提供一个技术交流与学习的平台。 优维…

js两种对象混合写,返回的是哪一个

<script>function jiafa() {this.name "xuhaitao";this.age 36;var obj {};obj.xx "hunkxu";obj.yy "88";return obj;}var aa new jiafa();console.log(aa);</script> 打印&#xff1a; FR&#xff1a;徐海涛(hunk xu)

3D引擎龙头Unity:元宇宙和AI活跃玩家

Unity是用于创建和操作交互式实时3D内容的世界领先平台。凭借灵活的编辑器、友好的开发环境、丰富的工具套件&#xff0c;Unity吸引了大量开发者&#xff0c;全球排名前1000的移动游戏70%以上使用了Unity的创作和运营解决方案&#xff0c;如今&#xff0c;Unity引擎在工业场景、…

leaflet地图移动防抖问题

现在有这么一个需求&#xff0c;当移动地图时&#xff0c;需要获取当前地图范围属于那个城市。如果频繁移动地图&#xff0c;会不停的调用接口获取当前地图视图所属城市&#xff0c;所以加个防抖&#xff0c;减少请求。代码示例&#xff1a;<!DOCTYPE html> <html>…

【Leetcode】36. 有效的数独

一、题目 1、题目描述 请你判断一个 9 x 9 的数独是否有效。只需要 根据以下规则 ,验证已经填入的数字是否有效即可。 数字 1-9 在每一行只能出现一次。 数字 1-9 在每一列只能出现一次。 数字 1-9 在每一个以粗实线分隔的 3x3 宫内只能出现一次。(请参考示例图) 注意:…

微信小程序生态15- 批量提交微信小程序审核的一种方式

文章导航 微信小程序生态1-初识小程序 微信小程序生态2-创建一个微信小程序 微信小程序生态3-微信小程序登录流程设计 微信小程序生态4-扫普通二维码进入小程序、打开短链接进入小程序 微信小程序生态5-微信公众号扫码登录PC端网页 微信小程序生态6-微信公众号授权登录(适用于…

字节跳动(抖音),软件测试四面,面试题总结!走过路过不要错过

面试一 1、 简单做一下自我介绍 2、 简要介绍一下项目/你负责的模块/选一个模块说一下你设计的用例 3 、get请求和post请求的区别 4、 如何判断前后端bug/3xx是什么意思 5、 说一下XXX项目中你做的接口测试/做了多少次 6、 http和https的区别 7、 考了几个ADB命令/查看连…

JAVA_WEB 购物商城(WEB端)

仓库地址&#xff1a;https://gitee.com/ThMyGitee/EeasyEeasyCityFrontEnd.git CSDN的友友们&#xff0c;项目如果适合您的话&#xff0c;麻烦给个小小的Star&#xff0c;谢谢啦&#xff01; JAVA_WEB 购物商城(WEB端) 效果图: 技术选型: 后端技术栈 Jsp Servlet &#x…

【力扣算法01】之最接近的三数之和

文章目录 前言问题描述示例 1示例 2提示 解题思路代码分析完整代码运行效果如图执行示例代码1执行示例代码2 完结 前言 近期已经将python 的大部分内容讲完了, 接下来的一段时间会着重于算法和面试题相关的内容, 确保学有所用, 同时也为准备进入大厂的童靴们做个铺垫, 记得关注…

抖音seo源码-源代码开发搭建-开源部署操作日志

一、开发者前言大环境概述 抖音seo源码开发是一项非常重要的技术&#xff0c;在抖音上&#xff0c;有很多视频&#xff0c;如果你想让自己的视频脱颖而出&#xff0c;那么就需要优化自己的seo源码。不过&#xff0c;为了保护用户的隐私&#xff0c;抖音并不公开其seo算法的细节…

Alluxio入门手册

1. 定义 Alluxio&#xff08;之前名为 Tachyon&#xff09;是世界上第一个以内存为中心的虚拟的分布式存储系统。 它统一了数据访问的方式&#xff0c;为上层计算框架和底层存储系统构建了桥梁。应用只需要连接Alluxio即可访问存储在底层任意存储系统中的数据。此外&#xff0c…

太难了,别再为难我们这些测试工程师了好吗?

前言 有不少技术友在测试群里讨论&#xff0c;近期的面试越来越难了&#xff0c;要背的八股文越来越多了,考察得越来越细&#xff0c;越来越底层&#xff0c;明摆着就是想让我们徒手造航母嘛&#xff01;实在是太为难我们这些测试工程师了。 这不&#xff0c;为了帮大家节约时…

从零开发短视频电商 Jmeter基础介绍和使用心得

文章目录 基本Jmeter主要元件元件执行顺序提取器Json提取器边界值提取器 高级动态参数参数化前后关联设置Jmeter语言为中文环境非GUI模式压测分布式压测监控模板 基本 Jmeter主要元件 1、测试计划&#xff1a;是使用 JMeter 进行测试的起点&#xff0c;它是其它 JMeter测试元…

一、Zabbix介绍及6.0部署

Zabbix 一、Zabbix介绍1、zabbix是什么&#xff1f;2、zabbix的监控原理是什么&#xff1f;3、Zabbix 6.0新特性:4、Zabbix 6.0 功能组件&#xff1a; 二、Zabbix 6.0 部署1、部署 zabbix 服务端2、部署数据库3、编译安装 zabbix Server 服务端4、部署 Web 前端&#xff0c;进行…

Jmeter接口关联(二)【使用jsonpath表达式提取值】与python中使用jsonpath提取值 完成接口关联

文章目录 前言一、jmeter中使用jsonpath的表达式来提取值 1、使用jsonpath表达式匹配date的所有数据2、使用json提取器提取想要拿取的date值二、在Python中使用Jsonpath来完成接口的关联 ​​​​​​​1、jsonpath使用讲解 2、jsonpath在接口关联中使用总结 前言 Jmeter中关…

NFT + JAVA + 可更新合约

前言 合约部署参考&#xff1a;hardhat 合约开发参考&#xff1a;openzeppelin 钱包&#xff1a;metamask 部署链使用的是&#xff1a;sepolia 合约生成Java&#xff1a;solc 合约部署和测试自行处理 1. 合约 合约代码&#xff1a;ZhuZiNFTU.sol // SPDX-License-Iden…