LeetCode 132. 分割回文串 II(经典必会)

news2024/11/24 15:03:33

LeetCode 132. 分割回文串 II

给你一个字符串 s,请你将 s 分割成一些子串,使每个子串都是回文串。
返回符合要求的 最少分割次数 。
示例 1:
输入:s = “aab”
输出:1
解释:只需一次分割就可将 s 分割成 [“aa”,“b”] 这样两个回文子串。
示例 2:
输入:s = “a”
输出:0
示例 3:
输入:s = “ab”
输出:1
提示:
1 <= s.length <= 2000
s 仅由小写英文字母组成

动态规划

class Solution:
    def minCut(self, s: str) -> int:
        # dp[i] 表示从第i个字符构成的字符串可以划分成的最少子回文串,字符从0开始计数
        # dp[i] = min(序列S) S中元素为 dp[k] + 1  k from 0 to i-1 且 s[k+1:i]为回文串
        # 每种情况能否成立需要知道+1是否成立,也就是需要知道,右边剩余字符串是否是回文子串
        # 那么如何求的s中任意连续字串是否为回文串呢?

        n = len(s)
        judge = [[False] * n for _ in range(n)]
        for i in range(n - 1):
            g, h = i, i + 1
            while -1 < g < h < n and s[g] == s[h]:
                judge[g][h] = True
                g -= 1
                h += 1
        for i in range(n):
            judge[i][i] = True
            g, h = i - 1, i + 1
            while -1 < g < h < n and s[g] == s[h]:
                judge[g][h] = True
                g -= 1
                h += 1

        dp = [i for i in range(1, n + 1)]
        for i in range(n):
            if judge[0][i]:
                dp[i] = 1

        for i in range(1, n):
            for j in range(i):
                if judge[j + 1][i]:
                    dp[i] = min(dp[i], dp[j] + 1)
        return dp[n - 1] - 1

时间复杂度: O ( n 2 ) O(n^2) O(n2)。计算字符串中所有回文串耗时 O ( n ) O(n) O(n)。动态规划计算最少划分次数外层循环次数函数为 l a y e r 1 ( n ) = n layer1(n)=n layer1(n)=n,求面积得耗时 O ( n ∗ n / 2 ) = O ( n 2 ) O(n*n/2)=O(n^2) O(nn/2)=O(n2)
空间复杂度:字符串回文串判定消耗 O ( n 2 ) O(n^2) O(n2),动态规划dp数组消耗 O ( n ) O(n) O(n),空间复杂度 O ( n 2 ) O(n^2) O(n2)

本题动态规划的思路相对好想,但是关于字符串中所有回文串的判定处理不好会导致时间复杂度过高,导致超时,预处理序列是一种常用的以空间换时间的方法。下面总结一下本题以及一些拓展:

O ( n 2 ) O(n^2) O(n2)耗时求出字符串中所有连续字符子串是否为回文串。
设dp[i][j]表示从第i个字符到第j个字符构成的字串是否为回文串,字符从0开始计数
最经典的分成两种情况讨论。
若回文串为偶数长度,则最中间两个数往外扩展一定对称,所以长度为n的字符串中连续两个数会有n-1对,对每一对数据进行判断即可
若回文串为奇数长度,则选一个中间数字往两边扩展即可,共有n中选法。

n = len(s)
judge = [[False] * n for _ in range(n)]
for i in range(n - 1):
    g, h = i, i + 1
    while -1 < g < h < n and s[g] == s[h]:
        judge[g][h] = True
        g -= 1
        h += 1
        
for i in range(n):
    judge[i][i] = True
    g, h = i - 1, i + 1
    while -1 < g < h < n and s[g] == s[h]:
        judge[g][h] = True
        g -= 1
        h += 1

而事实上,这里有一种很巧妙地方式可以合并上面两种情况。

奇数和偶数的区别在于,有没有中间值,如果只有一个字符,那么一定是回文串,假设不考虑中间到底有没有字符,那么一个回文串最外面的左右字符一定得相同。假设左边是第i个字符,右边是第j个字符,那么dp[i] == dp[j],若i到j构成回文串那么i+1到j-1也一定构成,则有
dp[i][j] = dp[i] == dp[j] and dp[i+1][j-1]

不过这里有一些特殊情况:

  1. 当i==j时,dp[i+1][j-1]中i+1>j-1导致用到了一个无意义的状态
  2. 当i+1==j时,同理,也用到了一个无意义状态
    不过巧合的是,当用到无意义状态的时候,只需要看dp[i] == dp[j] 即可,所以这里等效可以把无意义状态全部置为True。

则会有完整状态转移方程。

dp[i][j] =

# 由于在计算dp[i][j]的时候不会用到dp[i][j]本身的值,所以可以同过全部赋值True的方式简化赋初值
# 只需要计算矩阵的一半即可,对角线也无需计算
n = len(s)
judge = [[True] * n for _ in range(n)]
for i in range(n - 1):
    for j in range(i + , n):
        judge[i][j] = judge[i + 1][j - 1] and s[i] == s[j]

另外一个场景
给定数字序列,从第i个数字到第j个数字之和,求出所有情况的和。

蛮力就是三层循环,第一层i,第二层j,第三层枚举求和

但实际上可以优化,求和即可,dp[i]为第0到第i个数字的和那么f[i][j] = dp[j] - dp[i-1]

这样只需要O(n)时间就可以构造好f[i][j]的结果,O(n)通常不会影响到核心解题逻辑的时间复杂度。

还有类似求最大值,给定数组序列,f[i]为除第i个数之外所有数的最大值,最小值也同理。只需遍历一次找到最大值和次大值,第i个数不是最大值f[i]就是最大值,第i个数是最大值f[i]就是次大值。

又如前后缀数组等等。

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

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

相关文章

EditPlus安装使用

1.进入EditPlus官网(https://www.editplus.com/)点击第二行蓝字 2.点击More options第一行蓝字 3.点击exe文件进入安装&#xff0c;点击Accept 4.选择下载路径 4.点击editplus.exe 5.在许可证协议中点击yes 6.输入username和regcode即可使用(也可以试用30天)

Leetcode 岛屿数量

首先检查网格是否为空&#xff0c;如果为空&#xff0c;直接返回 0。遍历网格中的每一个元素&#xff0c;当遇到陆地&#xff08;1&#xff09;时&#xff0c;计数器加 1&#xff0c;并且通过 DFS 将与该陆地相连的所有部分标记为已访问&#xff08;即设为 0&#xff09;。DFS …

第 22 章 - 你不能错过的Elasticsearch核心知识点-BM25相关性评分算法(进阶)

文章目录 前言分片对 Elasticsearch 相关性评分的影响BM25 算法和它的变量效果应用将 b b b 值设置为 0将 k 1 k1 k1 设置为0 总结 前言 上一章介绍了 Elasticsearch 的读写优化技巧。本章将深入探讨与 Elasticsearch 相关的 BM25 相关性评分公式。 我们将全面解析 BM25 如…

【Java】C++转Java基础知识

1. Java基础知识 1.1 JDK和JVM 在Java中&#xff0c;JDK称为Java开发工具包(Java Development Kit)&#xff0c;包含了Java开发需要使用的工具包&#xff0c;前面的版本中JRE和JDK是分开的两个文件夹&#xff0c;从Java9开始&#xff0c;JDK中还包含了JRE(Java Runtime Envir…

STM32外设详解——ADC

来源&#xff1a;铁头山羊 基本概念 ①ADC是模数转换器的统称&#xff0c;stm32f103c8t6内部集成了2个12位主次逼近型ADC&#xff0c;外设名称为ADC1、ADC2。 ② 采样深度为12位意味着ADC可以将0~3.3V的模拟电压等比转换为0~4095的数字值&#xff08;分割为2的12次方份&…

猫头虎分享:Python库 Selenium 的简介、安装、用法详解入门教程

&#x1f42f; 猫头虎分享&#xff1a;Python库 Selenium 的简介、安装、用法详解入门教程 &#x1f680; 今天&#xff0c;猫头虎带大家深入了解 Selenium&#xff0c;这是一个非常流行的自动化测试工具&#xff0c;用于浏览器自动化。无论你是进行网页数据抓取&#xff0c;还…

Starrocks表的数据库字段类型及与MySQL 的差异

最近有用到Starrocks&#xff0c;实际使用中基本可以当作mysql来使用&#xff0c;但是数据库字段还是有所不同的。 与MySQL相同或相似的基础类型 数值类型 TINYINT、SMALLINT、INT/INTEGER、BIGINT&#xff1a;在Starrocks和MySQL中的定义和用途基本相似。都是用于存储整数&…

YOLO11改进|注意力机制篇|引入Mamba注意力机制MLLAttention

目录 一、【MLLAttention】注意力机制1.1【MLLAttention】注意力介绍1.2【MLLAttention】核心代码 二、添加【MLLAttention】注意力机制2.1STEP12.2STEP22.3STEP32.4STEP42.5STEP5 三、yaml文件与运行3.1yaml文件3.2运行成功截图 一、【MLLAttention】注意力机制 1.1【MLLAtte…

[Linux#66][TCP->IP] 面向字节流 | TCP异常 | filesocket | 网络层IP

目录 1. 面向字节流 思考&#xff1a;对于UDP协议来说&#xff0c;是否也存在“粘包问题”呢&#xff1f; 2.TCP 异常情况 3.知识 1.UDP实现可靠传输(经典面试题) 2. 网络抓包 | 爬虫 3.打通文件和 socket 的关系 4.网络层&#xff1a;IP 前置知识 1. 面向字节流 udp…

Java+vue部署版本反编译

&#x1f3c6;本文收录于《全栈Bug调优(实战版)》专栏&#xff0c;主要记录项目实战过程中所遇到的Bug或因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&am…

C++STL(2)

queue(队列) queue是一种先进先出的数据结构。 queue提供了一组函数来操作和访问元素&#xff0c;但它的功能相对较简单。 push(x):在队尾插入元素 x pop():弹出队首元素 front():返回队首元素 back():返回队尾元素 empty():检查队列是否为空 size0:返回队列中元素的个数 pri…

Android ViewModel

一问&#xff1a;ViewModel如何保证应用配置变化后能够自动继续存在&#xff0c;其原理是什么&#xff0c;ViewModel的生命周期和谁绑定的? ViewModel 的确能够在应用配置发生变化&#xff08;例如屏幕旋转&#xff09;后继续存在&#xff0c;这得益于 Android 系统的 ViewMod…

模拟电子电路基础(常见半导体+multisim学习1)

目录 1.半导体的基础 1.1.半导体基础知识 1.1.1本征半导体 1.1.2杂质半导体 1.1.3PN结 1.2半导体二极管 1.2.1半导体二极管的几种常见结构 1.2.2二极管的伏安特性曲线 1.2.3二极管的主要参数 1.2.4二级管的等效电路 1.2.5稳压二极管 1.2.其他类型二极管 2.multisim的…

双目视觉搭配YOLO实现3D测量

一、简介 双目&#xff08;Stereo Vision&#xff09;技术是一种利用两个相机来模拟人眼视觉的技术。通过对两个相机获取到的图像进行分析和匹配&#xff0c;可以计算出物体的深度信息。双目技术可以实现物体的三维重建、距离测量、运动分析等应用。 双目技术的原理是通过两…

Docker-nginx数据卷挂载

数据卷&#xff08;volume&#xff09;是一个虚拟目录&#xff0c;是容器内目录与宿主机目录之间映射的桥梁。 以Nginx为例&#xff0c;我们知道Nginx中有两个关键的目录&#xff1a; html&#xff1a;放置一些静态资源conf&#xff1a;放置配置文件 如果我们要让Nginx代理我们…

java项目之厨艺交流平台设计与实现(源码+文档)

项目简介 厨艺交流平台设计与实现实现了以下功能&#xff1a; 厨艺交流平台设计与实现的主要使用者管理员管理用户信息&#xff0c;可以添加&#xff0c;修改&#xff0c;删除用户信息信息。 &#x1f495;&#x1f495;作者&#xff1a;落落 &#x1f495;&#x1f495;个人…

分享一个从图片中提取色卡的实现

概述 最近在做“在线地图样式配置”的功能的时候&#xff0c;发现百度地图有个功能时上传一张图片&#xff0c;从图片中提取颜色并进行配图。本文就简单实现一下如何从图片中提取色卡。 效果 实现 实现思路 通过canvasdrawImage绘制图片&#xff0c;并通过getImageData获取…

主数据系统管理、运维的实践经验与建议

公司在预研一个新的主数据系统&#xff0c;领导问笔者给些建议。结合近两年的主数据系统管理、维护经验&#xff0c;给大致写了一些。 里面少数问题属于目前在运行的主数据系统的系统痛点所致&#xff0c;不过大多数笔者认为是通病&#xff0c;一口气写来已两千字&#xff0c;…

【验证码识别】Python+卷积神经网络算法+人工智能+深度学习+Django网页界面+计算机课设项目+TensorFlow+算法模型

一、介绍 验证码识别&#xff0c;使用Python作为开发语言&#xff0c;通过TensorFlow搭建CNN卷积神经网络算法模型&#xff0c;并通过对收集的几千张验证码图片作为数据集&#xff0c;然后进行迭代训练&#xff0c;最终得到一个识别精度较高的模型文件&#xff0c;然后使用Dja…

Cesium 区域高程图

Cesium 区域高程图 const terrainAnalyse new HeightMapMaterial({viewer,style: {stops: [0, 0.05, 0.5, 1],//颜色梯度设置colors: [green, yellow, blue , red],}});