LeetCode - 1653 使字符串平衡的最少删除次数
创始人
2024-05-29 16:19:10
0

目录

题目来源

题目描述

示例

提示

题目解析

算法源码


题目来源

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

相关内容

热门资讯

老安卓系统能干啥,重温经典功能... 你手中的老安卓手机是不是已经陪伴你走过了好几个春夏秋冬呢?别看它外表略显沧桑,但它的内心可是充满活力...
安卓系统怎么更改设置 手机里的安卓系统是不是有时候让你觉得有点儿不爽?比如,那些默认的设置总感觉不够个性,或者是某些功能用...
安卓系统hd什么意思,高性能与... 你有没有注意到,你的安卓手机屏幕上时不时会出现“HD”这个词?是不是好奇这到底是什么意思呢?别急,今...
王者荣耀ios系统怎么变安卓系... 你是不是也和我一样,对王者荣耀iOS系统到安卓系统的转换充满了好奇?想象那些熟悉的英雄角色,那些刺激...
安卓系统共享微信 你是不是也和我一样,对安卓系统上的微信共享功能充满了好奇?想象和朋友一起玩游戏,突然需要分享你的微信...
安卓系统怎样设置不更新,安卓系... 手机里的安卓系统总是时不时地跳出来提醒你更新,有时候真让人有点烦。不过别急,今天就来教你怎么设置安卓...
苹果系统下的安卓模拟,探索跨平... 你有没有想过,在苹果系统上也能玩安卓游戏?没错,就是那种你一按屏幕,角色就能飞檐走壁、大杀四方的游戏...
电脑ios系统和安卓系统的区别... 你有没有发现,现在手机市场上,电脑的操作系统也是分成了两大阵营呢?一个是苹果家的iOS系统,另一个就...
安卓系统看星星软件,安卓系统下... 夜幕降临,星空璀璨,你是否也和我一样,对那漫天繁星充满了好奇和向往?想要在手机上也能拥有一份观星体验...
安卓怎么进入双系统游戏,解锁游... 亲爱的安卓玩家们,你是否曾梦想过在同一个设备上同时畅玩两个版本的经典游戏?比如,一边享受原汁原味的安...
安卓系统华为手机投屏,华为手机... 亲爱的手机控们,你是否有过这样的体验:坐在沙发上,手里拿着华为手机,却想在大屏幕上享受高清电影或游戏...
安卓系统怎么屏蔽群,轻松守护你... 你是不是也遇到了这样的烦恼?手机里群消息太多,有时候甚至让人头都大了。别急,今天就来教你怎么在安卓系...
暗影格斗4.0安卓系统,畅爽战... 亲爱的玩家们,你是否在寻找一款既能让你热血沸腾,又能让你沉浸在战斗中的游戏呢?今天,我要给你带来一款...
安卓系统装win10,探索跨平... 你有没有想过,把Windows 10装在你的安卓系统上?听起来是不是有点不可思议?但别急,今天我就要...
rmvb播放器安卓系统,轻松享... 你有没有遇到过这种情况?手机里存了一大堆rmvb格式的视频,想看的时候却发现找不到合适的播放器。别急...
原生系统安卓手机有哪些,探索系... 你有没有想过,为什么你的手机用起来那么顺畅,而别人的手机却时不时卡顿呢?这其中的奥秘,就在于原生系统...
安卓系统的优势和缺点,全面解析... 你有没有发现,手机的世界里,安卓系统就像是个超级明星,无处不在,又备受争议。今天,咱们就来聊聊这个话...
安卓系统为啥不能更新,探究原因... 你有没有遇到过这种情况:手机里的安卓系统突然告诉你,有新版本可以更新了,但你点开一看,哎呀妈呀,怎么...
适合安卓系统4的饥荒,饥荒手游... 《饥荒》安卓版:探索生存的奇妙世界在广袤无垠的宇宙中,存在着一个被无尽黑暗所笼罩的星球——荒野。这里...
安卓系统怎么更新包,安卓系统包... 亲爱的安卓用户们,你是否也和我一样,时不时地收到系统更新提醒,心里痒痒的想要给手机来个大变身?别急,...