当前位置: 首页 > news >正文

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

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

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

相关文章:

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

目录 题目来源 题目描述 示例 提示 题目解析 算法源码 题目来源 1653. 使字符串平衡的最少删除次数 - 力扣&#xff08;LeetCode&#xff09; 题目描述 给你一个字符串 s &#xff0c;它仅包含字符 a 和 b​​​​ 。 你可以删除 s 中任意数目的字符&#xff0c;使得 …...

【微信小程序】-- 页面事件 - 上拉触底 - 案例(二十七)

&#x1f48c; 所属专栏&#xff1a;【微信小程序开发教程】 &#x1f600; 作  者&#xff1a;我是夜阑的狗&#x1f436; &#x1f680; 个人简介&#xff1a;一个正在努力学技术的CV工程师&#xff0c;专注基础和实战分享 &#xff0c;欢迎咨询&#xff01; &…...

《超导电子技术及其应用》学习日志(二)

约瑟夫森效应 约瑟夫森理论 约瑟夫森方程 &#xff08;1&#xff09;每一个库柏对都可视为质量为2m、电量为2e的复合载流子&#xff0c;定向运动速度v就是库柏相对质心的速度。处于超导态的库柏对凝聚于同一量子态&#xff0c;运载电流时具有完全相同的动量P。用微观波函数来…...

微信小程序this指向问题

前言 最近在开发微信小程序时不时会遇到一个很奇怪的问题&#xff0c;有些情况下用 this.setData 可以改变视图显示&#xff0c;有些情况下使用 this.setData 无效&#xff0c;这又是为什么呢&#xff1f; 问题描述 在解释这个问题前&#xff0c;我们先来看两段代码&#xff1…...

【报错】paddle相关报错和处理方法

1 报错 😱😱😱 ModuleNotFoundError: No module named paddle 2 解决方法 💉💉💉 pip --default-timeout=100 install paddlepaddle -i http://pypi.douban.com/simple --trusted-host pypi.douban.com 🎉🎉🎉🎉🎉🎉 1 报错 😱😱😱 from paddl…...

unity的安装配置和第一个游戏-unity开学第一课

许多的小伙伴学编程语言其实是因为玩游戏&#xff0c;玩着玩着就想写游戏了&#xff0c;于是开始学习c学习C#学习java&#xff0c;但相比之下C#的操作会更加容易&#xff0c;所以就开始学习unity来编游戏了。这里就就算是unity开学第一课啦-unity的安装配置和第一个游戏。 文章…...

Elsevier上传LaTeX 修改稿踩坑

背景 千辛万苦修改完论文&#xff0c;结果发现要求上传可编辑文件&#xff0c;tex上传真的太难了&#xff0c;一堆坑&#xff0c;尤其是编译错误&#xff0c;要等系统创建pdf后才能找到。中间还打了北京的客服电话&#xff0c;结果他们那边并不懂相关的东西。说latex是第三方公…...

秒懂算法 | 搜索基础

本篇介绍了BFS和DFS的概念、性质、模板代码。 01、搜索简介 搜索,就是查找解空间,它是“暴力法”算法思想的具体实现。 暴力法(Brute force,又译为蛮力法):把所有可能的情况都罗列出来,然后逐一检查,从中找到答案。这种方法简单、直接,不玩花样,利用了计算机强大的…...

Flutter 自定义今日头条版本的组件,及底部按钮切换静态样式

这里写目录标题1. 左右滑动实现标题切换&#xff0c;点击标题也可实现切换&#xff1b;2. 自定义KeepAliveWrapper 缓存页面&#xff1b;2.2 使用3. 底部导航切换&#xff1b;4. 自定义中间大导航&#xff1b;5.AppBar自定义顶部按钮图标、颜色6. Tabbar TabBarView实现类似头条…...

SpringBoot学习笔记(二)配置文件

1、配置文件SpringBoot使用一个全局的配置文件&#xff0c;配置文件名是固定的&#xff1b;application.propertiesapplication.yml配置文件的作用&#xff1a;修改SpringBoot自动配置的默认值&#xff1b;SpringBoot在底层都给我们自动配置好&#xff1b;YAML&#xff1a;以数…...

09说说乐观锁和悲观锁

乐观锁和悲观锁是在并发编程中经常用到的两种锁机制。悲观锁是指在访问共享资源之前&#xff0c;会先加锁&#xff0c;以防止其他线程修改该资源&#xff0c;从而保证数据的一致性和完整性。在使用悲观锁时&#xff0c;如果一个线程已经占用了该资源&#xff0c;那么其他线程只…...

【C++】vector的模拟实现

文章目录1.查看STL源码2.vector的模拟实现1. 构造函数无参构造构造n个 val迭代器模板2. reserve3. 迭代器4.pop_back 尾删5.resize6.push_back7.insert迭代器失效—— pos为野指针迭代器失效——修改迭代器位置8. erase对于VS和Linux环境测试3.深浅拷贝问题4. 整体代码实现1.查…...

THUPC-2023 游记

清华校赛&#xff0c;战火重燃 原文链接 宣传图 上周四同学在洛谷无意间看到了宣传图&#xff0c;当时很有感触。不知觉间&#xff0c;又是一年春&#xff0c;又是一场触动心弦的 THUPC 了。 周五的团建过于有趣&#xff0c;致使我完全将 THUPC 抛之脑后了。 周日上午被省选…...

Linux - 磁盘I/O性能评估

文章目录概述RAID文件系统与裸设备的对比磁盘I/O性能评判标准常用命令“sar –d”命令组合“iostat –d”命令组合“iostat –x”单独统计某个磁盘的I/O“vmstat –d”命令组合小结概述 RAID 可以根据应用的不同&#xff0c;选择不同的RAID方式 如果一个应用经常有大量的读操…...

计算机网络--网络基础

目录 一.互联网的组成 ​编辑 1.互联网的边缘部分 1.1客户-服务器方式 1.2对等连接方式 ​编辑 2.互联网的核心部分 2.1电路交换 2.2分组交换 2.3报文交换 二.计算机网络的类别 1.按网络的作用范围进行分类 2.按网络的使用者进行分类 3.用来把用户接入互联…...

Gin 接口超时控制

文章目录1.Gin 的 Middleware2.gin-contrib/timeout3.小结参考文献API 是现代应用程序中的重要组成部分&#xff0c;可以用于提供数据和功能&#xff0c;供客户端应用程序访问。由于网络不稳定、服务器负载、网络拥堵等因素&#xff0c;API 请求可能会花费较长时间。这可能导致…...

1.C#与.NET简介

目录 一、C#语言及其特点 二、C#与.NET Framework/.NET Core关系 三、C#应用开发 四、案例展示 五、学习环境 一、C#语言及其特点 C#是美国微软公司发布的一种面向对象的&#xff0c;运行于 .NET Framework 和 .NET Core &#xff08;完全开源&#xff0c;跨平台&#xff…...

OpenAI CTO、吴恩达夫人……AI 领域值得关注的「她」力量,个个都是女强人

内容一览&#xff1a; 「她时代」来临&#xff0c;一些有着强大信念与热情的女性&#xff0c;纷纷投身至 AI 领域&#xff0c;成为不可或缺的存在与力量。值此国际妇女节到来之际&#xff0c;HyperAI超神经盘点了领域内令人印象深刻的杰出的女性代表。 关键词&#xff1a;国际妇…...

[ 网络 ] 应用层协议 —— HTTP协议

目录 1.HTTP协议 1.1URL urlencode和urldecode 2. HTTP协议格式 HTTP请求 HTTP响应 3.告知服务器意图的HTTP方法 GET&#xff1a;获取资源 POST&#xff1a;传输实体主体 GET和POST的区别 使用Cookie的状态管理 4.返回结果的HTTP状态码 状态码告知从服务器端返回的…...

Spring Boot 整合 Redisson 缓存性能客户端(2023-03-06)

Spring Boot 整合 Redisson 缓存 (官网) 介绍: Redisson是一个在Redis的基础上实现的Java驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;。它不仅提供了一系列的分布式的Java常用对象&#xff0c;还提供了许多分布式服务。其中包括(BitSet, Set, Multimap, Sorte…...

Python爬虫实战:构建智能职位信息聚合工具JobClaw

1. 项目概述&#xff1a;一个面向开发者的智能职位信息聚合与解析工具最近在帮团队招聘和看机会的朋友聊天&#xff0c;发现一个挺普遍的问题&#xff1a;大家找技术岗位&#xff0c;要么在几个主流招聘App上反复刷&#xff0c;信息分散且格式不一&#xff1b;要么就是盯着几个…...

靠谱的工程防火门公司推荐工程防火门

在工程行业摸爬滚打十几年&#xff0c;我见过太多因防火门翻车的项目&#xff1a;验收反复返工、产品用了两三年就变形卡死、超大门洞找不到厂家定制…… 这些看似鸡毛蒜皮的小事&#xff0c;一旦卡到消防验收节点上&#xff0c;轻则赔钱延期&#xff0c;重则被责令停工整改。今…...

微信自动化终极指南:5个强大功能助你高效管理微信数据

微信自动化终极指南&#xff1a;5个强大功能助你高效管理微信数据 【免费下载链接】wechat-toolbox WeChat toolbox&#xff08;微信工具箱&#xff09; 项目地址: https://gitcode.com/gh_mirrors/we/wechat-toolbox 还在为繁琐的微信数据管理而烦恼吗&#xff1f;微信…...

开源项目remote2mac:用Windows远程桌面无缝控制macOS

1. 项目概述&#xff1a;远程桌面连接的另一条路如果你是一名需要在Windows电脑上远程控制macOS设备的开发者、设计师或者运维人员&#xff0c;那么“远程桌面”这个需求对你来说一定不陌生。传统的方案&#xff0c;比如微软的RDP&#xff08;远程桌面协议&#xff09;对Window…...

自组织映射(SOM):无监督拓扑保持的高维数据可视化与聚类

1. 什么是自组织映射&#xff08;SOM&#xff09;&#xff1f;它到底能帮你解决什么实际问题&#xff1f;我第一次在客户现场看到SOM落地&#xff0c;是在一家做工业设备预测性维护的公司。他们有上百台传感器&#xff0c;每台每秒产生十几维的振动、温度、电流数据&#xff0c…...

Mega:基于上下文工程的Brainbase平台AI开发效率革命

1. 项目概述&#xff1a;Mega&#xff0c;你的Brainbase平台AI工程专家如果你正在使用Claude Code、Cursor或者任何能读取文件的AI编程工具来构建基于Brainbase平台的对话式AI应用&#xff0c;那么你很可能遇到过这样的困境&#xff1a;你需要花费大量时间向AI解释Brainbase的架…...

从布朗运动到伊藤公式:金融随机世界的建模基石

1. 从花粉运动到股票价格&#xff1a;布朗运动的金融启示 1827年&#xff0c;英国植物学家罗伯特布朗在显微镜下观察到花粉颗粒在水中的不规则舞动&#xff0c;这个看似简单的物理现象却在80年后被爱因斯坦用数学语言精确描述。有趣的是&#xff0c;当我们将显微镜换成股票行情…...

从视频到文字:当B站知识需要被存档时,我们如何优雅地捕获声音

从视频到文字&#xff1a;当B站知识需要被存档时&#xff0c;我们如何优雅地捕获声音 【免费下载链接】bili2text Bilibili视频转文字&#xff0c;一步到位&#xff0c;输入链接即可使用 项目地址: https://gitcode.com/gh_mirrors/bi/bili2text 你是否曾有过这样的经历…...

Taotoken模型广场如何帮助开发者快速选型,对比主流模型特性

&#x1f680; 告别海外账号与网络限制&#xff01;稳定直连全球优质大模型&#xff0c;限时半价接入中。 &#x1f449; 点击领取海量免费额度 Taotoken模型广场如何帮助开发者快速选型&#xff0c;对比主流模型特性 对于需要接入大模型能力的开发者而言&#xff0c;面对市场…...

6自由度KUKA机械臂自主抓取系统:ROS架构设计与逆运动学技术实现深度解析

6自由度KUKA机械臂自主抓取系统&#xff1a;ROS架构设计与逆运动学技术实现深度解析 【免费下载链接】pick-place-robot Object picking and stowing with a 6-DOF KUKA Robot using ROS 项目地址: https://gitcode.com/gh_mirrors/pi/pick-place-robot 在工业自动化领…...