Leetcode 剑指 Offer II 094.分割回文串 II

news2024/12/23 15:00:10

题目难度: 困难

原题链接

今天继续更新 Leetcode 的剑指 Offer(专项突击版)系列, 大家在公众号 算法精选 里回复 剑指offer2 就能看到该系列当前连载的所有文章了, 记得关注哦~

题目描述

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

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

示例 1:

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

示例 2:

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

示例 3:

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

提示:

  • 1 <= s.length <= 2000
  • s 仅由小写英文字母组成

题目思考

  1. 如何尽可能优化时间复杂度?

解决方案

  • 分析题目, 最容易想到的思路就是从起点开始, 每遇到一个回文子串, 就可以将其作为一段分割, 或者不分割向后继续找更长的回文子串
  • 不过这个思路问题比较多, 不管是判断回文子串, 还是判断是否分割, 都需要大量重复计算, 如何优化呢?
  • 首先我们来优化回文子串的判断: 我们可以预先定义一个二维 flag 数组来加速, isPalindrome[i][j]用于表示闭区间子串[i,j]是否是回文, 这样我们只需要计算一遍每个子串是否回文, 后面直接判断 isPalindrome 即可, 从而避免重复计算
  • 那么对于当前子串[i,j], 如果s[i]==s[j]且子串[i+1,j-1]是回文, 则当前子串也是回文
  • 具体实现时, 我们可以使用两重循环求出: 外层循环从 n-1 开始逆序遍历 i, 内层循环从 i+1 开始顺序遍历 j, 这样可以保证 isPalindrome[i+1][j-1] 一定是之前已经求出的值, isPalindrome[i][j] 就等于isPalindrome[i + 1][j - 1] && s[i] == s[j]
  • 然后我们来优化分割位置的判断: 对于闭区间子串[0,j]而言, 假设下标 i 位于 0 到 j 之间, 且子串[i,j]是回文子串, 那么显然[0,j]的最小分割次数可以是[0,i-1]的最小分割次数加 1 (即加上新一段的回文子串[i,j]), 这样我们就可以利用之前保存的最小分割次数推导出来当前的最小分割次数, 从而避免重复判断
  • 由于可能存在多个满足要求的 i, 所以找到这些 i 之后, 取新得到的分割次数的最小值, 那就是[0,j]的最小分割次数
  • 这就是典型的动态规划的思想, 用数学语言来表示, 假设dp[j]代表子串[0,j]的最小分割次数, 那么就有:
    • if isPalindrome[0][j]: dp[j]=0
    • else: dp[j]=min(dp[i-1]+1) (1<=i<=j and isPalindrome[i][j])
    • 最终结果就是dp[n-1]
  • 下面的代码中有详细的注释, 方便大家理解
复杂度
  • 时间复杂度 O(N^2): 求回文子串需要两重循环, 这部分是O(N^2); 动态规划部分也是两重循环, 同样是O(N^2). 所以整体时间复杂度就是O(N^2)
  • 空间复杂度 O(N^2): 二维回文子串 flag 数组的空间消耗
代码
class Solution:
    def minCut(self, s: str) -> int:
        n = len(s)
        # isPalindrome[i][j]用于表示闭区间子串[i,j]是否是回文
        isPalindrome = [[True] * n for _ in range(n)]
        for i in range(n - 1)[::-1]:
            for j in range(i + 1, n):
                # 对于当前子串[i,j], 如果s[i]==s[j]且子串[i+1,j-1]是回文, 则当前子串也是回文
                # 外层循环倒序, 内层循环正序, 这样可以保证isPalindrome[i+1][j-1]一定是之前已经求出的值
                isPalindrome[i][j] = isPalindrome[i + 1][j - 1] and s[i] == s[j]

        # dp[i]表示以i结尾的最少分割次数, 结果即为dp[-1]
        dp = [float("inf")] * n
        for j in range(n):
            if isPalindrome[0][j]:
                # [0,j]本身就是回文串, 无需分割
                dp[j] = 0
            else:
                for i in range(1, j + 1):
                    # i代表最后一个子串[i,j]的起点
                    if isPalindrome[i][j]:
                        # 如果[i,j]回文的话, dp[j]就可以从dp[i-1]+1转移过来
                        # 因为有多种可能的i, 所以取最小的结果作为dp[j]的值
                        dp[j] = min(dp[j], dp[i - 1] + 1)
        return dp[-1]

大家可以在下面这些地方找到我~😊

我的 GitHub

我的 Leetcode

我的 CSDN

我的知乎专栏

我的头条号

我的牛客网博客

我的公众号: 算法精选, 欢迎大家扫码关注~😊

算法精选 - 微信扫一扫关注我

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

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

相关文章

Clean Minimalist GUI Pack (简约风格UI界面)

Unity 最简洁易用的 GUI 资源包。如果你在寻找资源商店上 UI 极简主义革命的发起者,你已经找到了。 这一极干净简约的 GUI 资源包是一款适合移动设备使用的游戏 UI 资源包,其中包含许多图标和元素,可用于创建具有简洁风格的完整游戏 UI。 功能: • 包括 3 种皮肤:深色、浅…

C++编程语言:基础设施:表达式(Bjarne Stroustrup)

第10章 表达式(Expressions) 目录 10.1 引言 10.2 一个桌面计算器程序 10.2.1 解析器(Parser) 10.2.2 输入(Input) 10.2.3 底层输入(Low-Level Input) 10.2.4 错误处理(Error-Handling) 10.2.5 驱动器(Driver) 10.2.6 头文件(Headers) 10.2.7 命令行参数 …

全网最火的AI技术:Rag详解

“Rag”是机器学习中的术语&#xff0c;通常指的是“Ragged Tensors”&#xff08;不规则张量&#xff09;。Ragged Tensors 是一种特殊类型的张量&#xff0c;允许不同的维度中的子张量有不同的长度或形状。这在处理诸如文本、序列数据等不定长的数据时特别有用。例如&#xf…

WebShell流量特征检测_哥斯拉篇

90后用菜刀&#xff0c;95后用蚁剑&#xff0c;00后用冰蝎和哥斯拉&#xff0c;以phpshell连接为例&#xff0c;本文主要是对后三款经典的webshell管理工具进行流量分析和检测。 什么是一句话木马&#xff1f; 1、定义 顾名思义就是执行恶意指令的木马&#xff0c;通过技术手…

Pytorch环境搭建时的各种问题

1 问题 1.一直soving environment&#xff0c;跳不出去。网络解决方案有&#xff1a;配置清华源&#xff0c;更新conda等&#xff0c;没起作用。2.下载完后&#xff0c;有3个要done的东西&#xff0c;最后那个exe开头的&#xff08;可能吧&#xff09;&#xff0c;总是报错。网…

C++常见异常汇总(一)

文章目录 1、error: ‘__s_getMD5Sum’ is not a member2、Field has incomplete type2.1 处理方案1&#xff1a;使用前置声明2.1 处理方案2&#xff1a;使用静态变量 3、无法访问基类的public函数 1、error: ‘__s_getMD5Sum’ is not a member 错误现象&#xff1a; error: …

统计学习方法与实战——统计学习方法之感知机

感知机 感知机三要素分析模型策略损失函数选择 算法原始形式对偶形式 相关问题 例子iris数据集分类实战数据集查看 显示结果sklearn 实战感知机 习题解答习题2.1解题步骤反证法 习题2.2习题2.3凸壳线性可分线性可分证明凸壳不相交证明充分性&#xff1a;凸壳不相交\Rightarrow⇒…

轻瑜伽 1.0.2 简约实用的瑜伽练习,随时随地放松身心,完全免费

轻瑜伽是一款完全免费的瑜伽练习软件&#xff0c;支持安卓。界面设计简洁明了&#xff0c;用户可以随时随地进行瑜伽练习。提供平衡性、灵活性、晨练等多种瑜伽课程&#xff0c;每种课程都有详细的动作指导&#xff0c;适合不同水平的用户。支持离线使用&#xff0c;随时随地享…

关于大模型和AIGC的36条笔记和真话

行业到底有多卷&#xff1f; 最新统计&#xff0c;中国已有130多个大模型问世&#xff0c;在网信办备案的算法模型也超过70多家。BAT等互联网巨头悉数下场发布AI大模型&#xff0c;仅2023年就有超60家创业公司拿到融资&#xff0c;产品更是布满了基础层、模型层和应用层。新一…

论文解读 | KDD2024 演化图上的森林矩阵快速计算

点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入&#xff01; 点击 阅读原文 观看作者直播讲解回放&#xff01; 作者简介 孙浩鑫&#xff0c;复旦大学博士生&#xff0c;主要研究方向为大规模图上快速算法设计。 概述 森林矩阵在网络科学、观点动力学和机器学习相关应用中…

基于深度学习的气象图像分类【mobilenet+VGG16+swin_transfomer+PyQt5界面】

深度学习天气图像分类 文章目录 1 绪论1.1 研究背景1.2 国内外研究现状1.2.1 国内外研究现状1.2.2 国内外研究现状 2 相关理论基础2.1 Tensorflow框架2.2 卷积神经网络2.2.1 神经元与权值共享2.2.2 结构组成2.2.3反向传播算法 2.3 MobileNetV1网络2.4 VGG16网络2.5 Transformer…

tb-nightly库安装报错

使用pip安装&#xff08;默认清华镜像&#xff09;tb-nightly库报如下错误&#xff1a; 网上查阅资料&#xff0c;尝试了以下方式&#xff1a; 使用conda安装失败&#xff01;使用pip install tb-nightly --index-url https://pypi.org/simple安装失败最后&#xff0c;换成阿…

[Linux]:进程(上)

✨✨ 欢迎大家来到贝蒂大讲堂✨✨ &#x1f388;&#x1f388;养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; 所属专栏&#xff1a;Linux学习 贝蒂的主页&#xff1a;Betty’s blog 1. 初识进程 1.1 进程的概念 在计算机世界中&#xff0c;进程是一个关键概念…

机器学习中的聚类艺术:探索数据的隐秘之美

一 什么是聚类 聚类是一种经典的无监督学习方法&#xff0c;无监督学习的目标是通过对无标记训练样本的学习&#xff0c;发掘和揭示数据集本身潜在的结构与规律&#xff0c;即不依赖于训练数据集的类标记信息。聚类则是试图将数据集的样本划分为若干个互不相交的类簇&#xff…

Confluence8.5.14安装

一、Centos8、安装jdk11(略) 二、mysql数据库 1、mysql安装包下载: MySQL :: Download MySQL Community Server 2、安装: https://downloads.mysql.com/archives/get/p/23/file/mysql-8.0.37-1.el8.x86_64.rpm-bundle.tar tar -xvf mysql-8.0.37-1.el8.x86_64.rpm-bund…

浏览器剪贴板 API Clipboard API

在 Web 开发领域&#xff0c;Clipboard API 就是一个备受关注的新利器&#xff0c;它为我们提供了在网页中访问和操作剪贴板的能力&#xff0c;极大地丰富了用户交互体验。本文将深入探讨 Clipboard API 的使用方法和潜在应用场景。 一. 什么是 Clipboard API&#xff1f; Cl…

集合及映射

1、集合类图 1&#xff09;ArrayList与LinkedList 区别 LinkedList 实现了双向队列的接口&#xff0c;对于数据的插入速度较快&#xff0c;只需要修改前后的指向即可&#xff1b;ArrayList对于特定位置插入数据&#xff0c;需要移动特定位置后面的数据&#xff0c;有额外开销 …

Windows 安装mysql 教程,mysql 多版本共存教程,傻瓜式安装教程

mysql 各版本官方下载地址&#xff1a;⬇ ⬇⬇⬇⬇⬇⬇⬇⬇⬇(点击下面链接前往)MySQL :: Download MySQL Community Server (Archived Versions)https://downloads.mysql.com/archives/community/ 首先我本地安装了 mysql8.0版本了&#xff0c;通过msi 进行安装的也就是傻瓜式…

SprinBoot+Vue高校网上缴费综合务系统的设计与实现

目录 1 项目介绍2 项目截图3 核心代码3.1 Controller3.2 Service3.3 Dao3.4 application.yml3.5 SpringbootApplication3.5 Vue 4 数据库表设计5 文档参考6 计算机毕设选题推荐7 源码获取 1 项目介绍 博主个人介绍&#xff1a;CSDN认证博客专家&#xff0c;CSDN平台Java领域优质…

文心快码前端工程师观点分享:人机协同新模式的探索之路(三)

本系列视频来自百度工程效能部的前端研发经理杨经纬&#xff0c;她在由开源中国主办的“AI编程革新研发效能”OSC源创会杭州站105期线下沙龙活动上&#xff0c;从一款文心快码&#xff08;Baidu Comate&#xff09;前端工程师的角度&#xff0c;分享了关于智能研发工具本身的研…