​力扣解法汇总1653. 使字符串平衡的最少删除次数

news/2024/7/3 3:44:46

目录链接:

力扣编程题-解法汇总_分享+记录-CSDN博客

GitHub同步刷题项目:

https://github.com/September26/java-algorithms

原题链接:力扣


描述:

给你一个字符串 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' 。​

解题思路:

* 解题思路:
* 首先,分别统计出a和b出现的次数。
* 然后从头向尾遍历,如果读到了a,自然不需要处理。
* 如果读到了b,则有两种可能:
* 第一种是保留这个b,那么后面的a都要删除,则直接用a的总数减去已遍历过的即为最少删除次数。
* 第二种是删掉这个b,那么次数已删除次数+1,继续遍历。总删除次数为已删除次数+后续的最少删除次数。

代码:

public class Solution1653 {

    public int minimumDeletions(String s) {
        int aNum = 0;
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (c == 'a') {
                aNum++;
            }
        }
        int readANum = 0;
        int minNum = Integer.MAX_VALUE;
        int deleteBNum = 0;
        for (int i = 0; i < chars.length; i++) {
            char aChar = chars[i];
            if (aChar == 'a') {
                readANum++;
                continue;
            }
            //保留
            minNum = Math.min(minNum, aNum - readANum + deleteBNum);
            if (minNum == 53) {
                System.out.println("");
            }
            //删除b
            deleteBNum++;
        }
        minNum = Math.min(minNum, aNum - readANum + deleteBNum);
        return minNum == Integer.MAX_VALUE ? 0 : minNum;
    }
}


http://lihuaxi.xjx100.cn/news/980184.html

相关文章

aws dynamodb 使用awsapi和PartiQL掌握dynamodb的CRUD操作

总结一下 dynamodb通常和java等后端sdk结合使用使用的形式可以是api或partiql语法调用dynamodb的用法不难&#xff0c;更重要的是维护成本&#xff0c;所需的服务集成&#xff0c;技术选型等和大数据结合场景下有独特优势 之后可能再看看java sdk中DynamoDBMapper的写法&…

【SpringCloud】SpringCloud面试题整理

文章目录1、什么是Spring Cloud&#xff1f;2、Spring Cloud和Dubbo的区别3、REST和RPC的区别4、SpringCloud如何实现服务的注册和发现5、什么是服务熔断和服务降级&#xff1f;6、项目中zuul常用的功能7、服务网关的作用8、ribbon和feign区别9、ribbon的负载均衡策略10、简述什…

Unity脚本复习

1.在Project面板中显示和创建的每一个脚本其实都是一个类&#xff0c;当我们把脚本挂载到Hierarchy层级中的游戏物体时&#xff0c;其实我们就实现了将脚本类实例化为一个脚本组件&#xff08;对象&#xff09;的过程 2.在游戏运行时&#xff0c;场景加载&#xff0c;游戏对象…

leetcode 困难 —— 不同的子序列(dp)

题目&#xff1a; 给定一个字符串 s 和一个字符串 t &#xff0c;计算在 s 的子序列中 t 出现的个数。 字符串的一个 子序列 是指&#xff0c;通过删除一些&#xff08;也可以不删除&#xff09;字符且不干扰剩余字符相对位置所组成的新字符串。&#xff08;例如&#xff0c;“…

JavaScript随机数

概念总结 js产生随机数通常是使用javascript的Math.random()函数 常用的几种方法&#xff1a;Math.random()表示:结果为0-1之间&#xff08;包括0,不包括1&#xff09;&#xff1b; Math.floor(Math.random()*101)表示结果为1-10之间的一个随机数 Math.floor(Math.random()…

Application工具方法

//注册这个接口registerActivityLifecycleCallbacks(activityLifecycleCallbacks);}Overridepublic void onTerminate() {//注销这个接口。unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);super.onTerminate();}public static List<Activity> activi…

剑指offer JZ6 从尾到头打印链表

Java 剑指offer JZ6 从尾到头打印链表 文章目录Java 剑指offer JZ6 从尾到头打印链表一、题目描述二、递归写法三、栈方法使用Java的递归和栈解决从尾到头打印链表的问题 一、题目描述 输入一个链表的头节点&#xff0c;按链表从尾到头的顺序返回每个节点的值&#xff08;用数组…

如何正确努力?7 分钟重新认识冰山模型。

我明明很努力&#xff0c;但好像没什么卵用&#xff1f;”这是很多职场人士或者即将进入职场的人容易产生的困惑。美国著名社会心理学家麦克利兰在 1973 年所提出的素质冰山模型大概能解释这种情况。不过&#xff0c;让我们先从【冰山一角】这个词开始。当你听到它&#xff0c;…