力扣每日一题 1653. 使字符串平衡的最少删除次数

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

题目

1653.使字符串平衡的最少删除次数
给你一个字符串 s ,它仅包含字符 ‘a’ 和 'b’​​​​ 。

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

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

示例 1:

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

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

提示:

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

思路

  1. 首先看到需要每一步比较最优情况的题目,可以首先考虑动态规划或者贪心,由于这里局部最优并不能保证整体最优,并且这里是根据前一步结果得到后一步结果,所以这里选择动态规划。
  2. 我们从左往右遍历字符串,题目要求其实就是找到让第一个b的左边只有a右边只有b的删除最小次数,所以我们要删除从左往右遍历到的所有b,当我们遇到a的时候,我们不确定是否当前删掉a会让整体得到最小的删除次数,所以我们用当前确定步骤的最小步骤+1和所有的b的计数来进行对比,并去较小值
  3. 继续这个步骤,下一步的最小值也可以这样计算得出。

动态规划

(1) 动态规划(英语:Dynamic programming,简称 DP),是一种在数学、管理科学、计算机科学、经济学和生物信息学中使用的,通过把原问题分解为相对简单的子问题的方式求解复杂问题的方法。动态规划常常适用于有重叠子问题和最优子结构性质的问题。
(2) 动态规划的核心思想就是,基于已经计算出来的结果来优化未知但是与已知相关的结果,即用已知来简化未知计算。

代码

class Solution:
    def minimumDeletions(self, s: str) -> int:
        # 就是要b都在a右边
        # dp思路,从左往右遍历,如果是
        b_count, dp = 0, 0
        for i in s:
            if i == 'a':
                dp = min(dp + 1, b_count) # 如果是a,要么连带删除当前a,要么删除所有的b
            else:
                b_count += 1 # 如果是b则b计数加1
        return dp

总结

  1. 动态规划问题一般可以通过前一步的最优值找下一步的最优值
  2. 要多刷基础算法了,这种题下次要秒杀

以上,共勉

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值