LeetCode - 1653 使字符串平衡的最少删除次数

news2024/11/13 20:46:49

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

1653. 使字符串平衡的最少删除次数 - 力扣(LeetCode)

题目描述

给你一个字符串 s ,它仅包含字符 'a' 和 'b'​​​​ 。

你可以删除 s 中任意数目的字符,使得 s 平衡 。当不存在下标对 (i,j) 满足 i < j ,且 s[i] = 'b' 的同时 s[j]= 'a' ,此时认为 s 是 平衡 的。

请你返回使 s 平衡 的 最少 删除次数。

示例

输入:s = "aababbab"
输出:2
解释:你可以选择以下任意一种方案:
下标从 0 开始,删除第 2 和第 6 个字符("aababbab" -> "aaabbb"),
下标从 0 开始,删除第 3 和第 6 个字符("aababbab" -> "aabbbb")。

输入:s = "bbaaaaabb"
输出:2
解释:唯一的最优解是删除最前面两个字符。

提示

  • 1 <= s.length <= 105
  • s[i] 要么是 'a' 要么是 'b'​ 。

题目解析

本题最优思路是采用动态规划。

我们可以定义一个dp数组,dp[i]的含义是将输入字符串s的0~i区间变得平衡的最少修改次数,而dp[i+1]其实就是相当于在dp[i]的0~i区间尾部追加一个字符,此时我们只需要考虑追加字符的处理来保持0~i+1区间平衡即可。

如果追加的s[i] == ‘b’, 则不会破坏平衡。

如果追加的s[i] == 'a',则会破坏破坏,此时有两种删除策略:

  1. 由于0~i-1已经平衡了,因此我们可以删除s[i],已期不会破坏0~i-1已形成的平衡,即dp[i] = dp[i-1] + 1  (+1对应删除s[i]的动作)
  2. 如果我们不删除s[i]的话,则需要将 0~i-1 中所有的b删除,因此在遍历s的过程中,我们还需要记录 0 ~ i 范围内的b的数量,比如countB[i] 含义为 0~i范围内b的数量。此时 dp[i] = countB[i-1]

我们只需要取上面两个dp[i]中最小的即可,即dp[i] = min(dp[i-1] + 1, countB[i-1])

但是上面将dp,countB定义为数组非常浪费内存,这里起始最终只要求的是输入s字符串0~n-1区间变得平衡的最小次数,因此我们不需要缓存其他区间最小数次数据,而是可以对dp,countB数组进行压缩,每次用最新值覆盖前一个值即可。

算法源码

JS

/**
 * @param {string} s
 * @return {number}
 */
var minimumDeletions = function(s) {
    let dp = 0 // dp记录的是将s的[0, i]区间变得平衡的最少次数
    let countB = 0 // countB 记录的是 s 的 [0, i]区间中b字符的个数

    for(let i = 0; i < s.length; i++) {
        if(s[i] == 'a') dp = Math.min(dp + 1, countB) // 末尾新增a会破坏平衡,此时需要进行删除动作
        else countB++ // 末尾新增b不会破坏平衡
    }

    return dp;
};

 

 

Java

class Solution {
    public int minimumDeletions(String s) {
        int dp = 0; // dp记录的是将s的[0, i]区间变得平衡的最少次数
        int countB = 0; // countB 记录的是 s 的 [0, i]区间中b字符的个数

        for(int i=0; i < s.length(); i++) {
            if(s.charAt(i) == 'a') dp = Math.min(dp + 1, countB); // 末尾新增a会破坏平衡,此时需要进行删除动作
            else countB++; // 末尾新增b不会破坏平衡
        }

        return dp;
    }
}

 

Python

class Solution(object):
    def minimumDeletions(self, s):
        dp = 0  # dp记录的是将s的[0, i]区间变得平衡的最少次数
        countB = 0  # countB 记录的是 s 的 [0, i]区间中b字符的个数

        for c in s:
            if c == 'a':
                dp = min(dp + 1, countB)  # 末尾新增a会破坏平衡,此时需要进行删除动作
            else:
                countB += 1  # 末尾新增b不会破坏平衡
        
        return dp

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

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

相关文章

广州银行冲刺A股上市:不良贷款规模突破100亿元,不良率飙升

又一家城商行平移申报IPO。近日&#xff0c;广州银行股份有限公司&#xff08;下称“广州银行”&#xff09;递交招股书&#xff0c;准备在深圳证券交易所主板上市。本次冲刺上市&#xff0c;广州银行计划募资约94.79亿元&#xff0c;国泰君安证券为其保荐机构。 截至目前&…

省选模拟测试23 T1直径

题目大意 给你一个数kkk&#xff0c;请你构造一棵节点数量小于等于5000的直径数量为kkk的树。 我们定义这棵树的直径为&#xff0c;所有满足1≤i<j≤n1\leq i<j\leq n1≤i<j≤n的(i,j)(i,j)(i,j)中&#xff0c;dis(i,j)dis(i,j)dis(i,j)最大的。如果有多个这样的(i,…

buu RSA what 1

题目描述&#xff1a; 题目四个文件&#xff0c;分别如下&#xff1a; rsa.py from Crypto.Util.number import bytes_to_long, getPrime from random import randint from gmpy2 import powmodp getPrime(2048) q getPrime(2048) N p*q Phi (p-1)*(q-1) def get_enc_key…

珠海先达盈致数据智能监控器+SaaS平台 轻松实现注塑生产管控

数据智能监控器 兼容市面上99%的注塑设备 直接读取设备生产数据与状态&#xff0c;如&#xff1a;计划产出、实际产出、累计产出、停机、节拍、线利用率、直通率、停产时间、工单状态、OEE、注胶时间…… 产品功能价值 ◎ OEE不达标报警&#xff0c;一手掌握生产效能 ◎ 首…

论文精读:Ansor: Generating High-Performance Tensor Programs for Deep Learning

文章目录1. Abstract2. Introduction3. Background4. Design Overview5. Program Sampling5.1 Sketch Generation5.2 Random Annotation6. Performance Fine-tuning6.1 Evolutionary Search6.2 Learned Cost Model7. Task Scheduler7.1 Problem Formulation7.2 Optimizing with…

使用nvm管理node版本

下载nvm版本参考文章&#xff1a;https://blog.csdn.net/langmanboy/article/details/126357952下载安装选择nvm的目录为d:\nvm&#xff0c;nodejs的目录为d:\nodejs&#xff1a;v14.0.0&#xff1a;执行nvm install 14生成的目录v16.0.0&#xff1a;执行nvm install 16生成的目…

详解vite原理

背景 自从尤大大的 vite 问世后&#xff0c;现在前端的构建工具由 webpack 转向 vite 的越来越多&#xff0c;今天主要来讨论一下 vite 的一些工作原理&#xff0c;讨论之前大家可以看这篇文章&#xff0c;尤其是注意其中谈到的 Bundleless&#xff0c;这样也能更好的理解 vit…

C#学习记录0.1

一、环境 编译器使用 Visual Studio 2022。  IDE(集成开发环境)搭建不做阐述。 二、创建项目与解决方案 打开Visual Studio 2022点击创建新项目&#xff0c;如下图所示。 搜索并选择控制台应用程序&#xff0c;如下图所示。 解决方案&#xff1a;针对用户的具体需要&#x…

RocketMQ【3】Rocketmq集群部署(多master多slave)异步复制

系列文章目录 RocketMQ【1】linux安装配置Rocketmq&#xff08;单机版&#xff09; RocketMQ【2】Rocketmq控制台安装启动&#xff08;单机版&#xff09; 文章目录系列文章目录一、异步复制的优缺点1、优点2、缺点二、架构1、架构图2、介绍3、机器配置三、配置1、master节点配…

ES32中OTA空中升级

打开SDK可视化配置&#xff0c;检查flash大小设定和“partition table”分区表设定。 左下角&#xff0c;点击SDK可视化配置按钮&#xff0c;进入配置。flash大小为4MB&#xff0c;Partition Table选择Factory app, two OTA definitions&#xff0c;分区表烧写偏移地址0x8000&…

关于缓存的理解

关于缓存的理解 为系统引入缓存的理由 通常情况&#xff0c;在我们面临系统的基础设施&#xff0c;例如数据库无法处理量级的请求时候&#xff0c;总是会下意识的使用缓存&#xff0c;这次我们以设计的角度思考&#xff0c;在为你的系统引入缓存之前&#xff0c;它是否真的需…

Windows下nvm的安装配置及使用

目录 一&#xff1a;nvm简介 二&#xff1a;nvm下载及安装 三&#xff1a;nvm配置镜像 四&#xff1a;nvm的基本使用 五&#xff1a;nvm的一些常用命令 一&#xff1a;nvm简介 nvm 全名叫做 nodejs version manage&#xff0c;是一个非常棒的nodejs的版本管理工具&#x…

Mp4屏录文件无法播放的修复方法

屏录文件算是比较特殊的一类文件&#xff0c;原因是其采集范围仅限于桌面&#xff0c;和我们现实的摄像机采集相比&#xff0c;桌面类的更单一&#xff0c;所以能实现较小的长度存放较多的帧。下面我来看一个屏录文件损坏后的修复案例&#xff0c;同时讲下CHS零壹视频修复程序Q…

GraphCut、最大流最小割定理

G&#xff08;V&#xff0c;E&#xff09;&#xff1b;V为点集&#xff0c;E为边集&#xff1b; 节点集V中的节点分为&#xff1a; &#xff08;1&#xff09;终端节点。不包含图像像素&#xff0c;用S和T表示。S为源点&#xff0c;T为汇点。图像分割中通常用S表示前景目标&a…

sql开窗函数

用的Oracle数据库进行测试一、数据准备DROP TABLE T_TEST; CREATE TABLE T_TEST (id NUMBER(10) VISIBLE NOT NULL ,姓名 VARCHAR2(50 BYTE) VISIBLE ,性别 VARCHAR2(50 BYTE) VISIBLE ,班级 VARCHAR2(50 BYTE) VISIBLE ,成绩 NUMBER(5,2) VISIBLE );INSERT INTO T_TEST VALUE…

【蓝桥杯专题】 递归 递推 (C++ | 洛谷 | acwing)

文章目录【蓝桥杯专题】 递归 &递推 &#xff08;C | 洛谷 | acwing&#xff09;复习P5534 【XR-3】等差数列P4994 终于结束的起点P1028 [NOIP2001 普及组] 数的计算波动数列[递归]母牛的故事蓝桥杯&#xff1a;耐摔指数菜狗现在才开始备战蓝桥杯QAQ 【蓝桥杯专题】 递归 &…

8 神经网络及Python实现

1 人工神经网络的历史 1.1 生物模型 1943年&#xff0c;心理学家W.S.McCulloch和数理逻辑学家W.Pitts基于神经元的生理特征&#xff0c;建立了单个神经元的数学模型&#xff08;MP模型&#xff09;。 1.2 数学模型 ykφ(∑i1mωkixibk)φ(WkTXb)y_{k}\varphi\left(\sum_{i1…

基于龙芯+国产FPGA 的VPX以太网交换板设计(三)

调试与测试是本系统设计实现的重要环节。单板调试主要包括各单元电路和接口 的调试&#xff0c;主要通过查看信号波形和运行软件对每个功能进行测试。本章将设计一系列 的调试和测试方案来验证电路设计的正确性。 6.1 电路板静态检查 经过原理图设计、印制板设计、制造、印制板…

HTML5智慧渔业WebGL可视化云平台

中国作为全球第一大水产养殖大国&#xff0c;未来中国水产养殖的出路在哪里?智慧渔业到底能起到多大的作用?在未来它能为我国水产养殖做出什么深刻的变化吗?今天给大家分享一个基于 数维图 的 Sovit3D可视化编辑器 构建的水产养殖3D可视化场景案例——智慧渔业可视化管理系统…

Hadoop框架:MapReduce基本原理和入门案例

Hadoop MapReduce是一种用于处理大数据的编程模型。它将数据集切分成多个小任务&#xff0c;每一个小任务都可以通过独立的计算来完成&#xff0c;最终的结果可以通过合并或更新数据来进行聚合。Hadoop MapReduce极大地简化了处理大数据的过程&#xff0c;因为它可以同时进行多…