​力扣解法汇总1234. 替换子串得到平衡字符串​

news2024/7/4 3:00:09

 目录链接:

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

GitHub同步刷题项目:

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

原题链接:力扣


描述:

有一个只含有 'Q', 'W', 'E', 'R' 四种字符,且长度为 n 的字符串。

假如在该字符串中,这四个字符都恰好出现 n/4 次,那么它就是一个「平衡字符串」。

给你一个这样的字符串 s,请通过「替换一个子串」的方式,使原字符串 s 变成一个「平衡字符串」。

你可以用和「待替换子串」长度相同的 任何 其他字符串来完成替换。

请返回待替换子串的最小可能长度。

如果原字符串自身就是一个平衡字符串,则返回 0

示例 1:

输入:s = "QWER"
输出:0
解释:s 已经是平衡的了。

示例 2:

输入:s = "QQWE"
输出:1
解释:我们需要把一个 'Q' 替换成 'R',这样得到的 "RQWE" (或 "QRWE") 是平衡的。

示例 3:

输入:s = "QQQW"
输出:2
解释:我们可以把前面的 "QQ" 替换成 "ER"。 

示例 4:

输入:s = "QQQQ"
输出:3
解释:我们可以替换后 3 个 'Q',使 s = "QWER"。

提示:

  • 1 <= s.length <= 10^5
  • s.length 是 4 的倍数
  • s 中只含有 'Q''W''E''R' 四种字符

解题思路:

* 解题思路:
* 统计四个字符的数量,使用数组保存,看看哪些是多余的,并且统计多出了几个,记录到map中,value为多出的次数。
* 使用双指针,然后遍历字符串,如果满足所有value<=0,则leftIndex++,并且value相应的增加。
* 否则rightIndex++,value相应的减少

代码:

public class Solution1234 {

    public int balancedString(String s) {
        int[] counts = new int[4];
        char[] chars = s.toCharArray();
        for (char c : chars) {
            if (c == 'Q') {
                counts[0]++;
            } else if (c == 'E') {
                counts[1]++;
            } else if (c == 'W') {
                counts[2]++;
            } else {
                counts[3]++;
            }
        }
        Map<Character, Integer> map = new HashMap<>();
        for (int i = 0; i < counts.length; i++) {
            int count = counts[i];
            int diffCount = count - s.length() / 4;
            if (diffCount > 0) {
                if (i == 0) {
                    map.put('Q', diffCount);
                } else if (i == 1) {
                    map.put('E', diffCount);
                } else if (i == 2) {
                    map.put('W', diffCount);
                } else {
                    map.put('R', diffCount);
                }
            }
        }
        if (map.size() == 0) {
            return 0;
        }

        //双指针ll
        int minLength = Integer.MAX_VALUE;
        int leftIndex = 0;
        int rightIndex = 0;
        while (rightIndex < chars.length) {
            if (allZero(map)) {
                minLength = Math.min(minLength, rightIndex - leftIndex);
                char leftChar = chars[leftIndex];
                Integer integer = map.getOrDefault(leftChar, 0);
                map.put(leftChar, integer + 1);
                leftIndex++;
                continue;
            }
            char rightChar = chars[rightIndex];
            Integer integer = map.getOrDefault(rightChar, 0);
            map.put(rightChar, integer - 1);
            rightIndex++;
        }
        while (leftIndex < chars.length) {
            if (allZero(map)) {
                minLength = Math.min(minLength, rightIndex - leftIndex);
                char leftChar = chars[leftIndex];
                Integer integer = map.getOrDefault(leftChar, 0);
                map.put(leftChar, integer + 1);
                leftIndex++;
                continue;
            }
            break;
        }
        return minLength;
    }

    private boolean allZero(Map<Character, Integer> map) {
        Collection<Integer> values = map.values();
        Iterator<Integer> iterator = values.iterator();
        while (iterator.hasNext()) {
            if (iterator.next() > 0) {
                return false;
            }
        }
        return true;
    }

}

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

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

相关文章

vue3.0 响应式数据

目录1.什么是响应式2. 选项式 API 的响应式数据3.组合式 API 的响应式数据3.1 reactive() 函数3.2 toref() 函数3.3 toRefs() 函数3.4ref() 函数总结1.什么是响应式 这个术语在今天的各种编程讨论中经常出现&#xff0c;但人们说它的时候究竟是想表达什么意思呢&#xff1f;本质…

spark03-读取文件数据分区数量个数原理

代码val conf: SparkConf new SparkConf().setMaster("local").setAppName("wordcount")val sc: SparkContext new SparkContext(conf)val rdd: RDD[String] sc.textFile("datas/1.txt",2)rdd.saveAsTextFile("output")数据格式 &a…

Docker 部署微服务项目

目录 一、前言 二、环境准备 1、安装 Docker 2、Docker 安装 MySQL 3、Docker 安装 Redis 4、Docker 安装 Nacos 5、Docker 安装 Nginx 三、部署后端服务 四、部署前端服务 感谢观看&#xff01;&#xff01; 一、前言 以谷粒学苑为例&#xff0c;使用 Docker 部署后…

【SpringBoot3.0源码】启动流程源码解析 • 上

文章目录初始化SpringBoot启动类&#xff1a; SpringBootApplication public class AppRun {public static void main(String[] args) {SpringApplication.run(AppRun.class, args);} }步入SpringApplication.run(AppRun.class, args)方法&#xff1a; 这里分为两步&#xff1…

【暴力量化】查找最优均线

搜索逻辑 代码主要以支撑概率和压力概率来判断均线的优劣 判断为压力&#xff1a; 当日线与测试均线发生金叉或即将发生金叉后继续下行 判断为支撑&#xff1a; 当日线与测试均线发生死叉或即将发生死叉后继续上行 判断结果的天数&#xff1a; 小于6日均线&#xff0c;用金叉或…

Tensorflow中的多层感知器学习

Tensorflow中的多层感知器学习 在这篇文章中&#xff0c;我们将了解多层感知器的概念和它在Python中使用TensorFlow库的实现。 多层感知 多层感知也被称为MLP。它是完全连接的密集层&#xff0c;可以将任何输入维度转化为所需维度。多层感知是一个具有多层的神经网络。为了创…

【黑马SpringCloud(6)】Sentinel解决雪崩问题

微服务保护雪崩问题服务保护技术Sentinel微服务整合Sentinel流量控制簇点链路入门练习流控模式关联链路流控效果Warm Up排队等待热点参数限流隔离和降级FeignClient整合Sentinel线程隔离(舱壁模式)实现线程隔离熔断降级慢调用异常比例/异常数授权规则获取origin给网关添加请求头…

ROS2+nav2+激光雷达导航实践(上)

目录写在前面安装nav2nav2介绍nav2实践map地图保存地图读取状态估计(TF变换)所需TF坐标base_link -> sensor framesodom -> base_linkLaser Scan Matcher for ROS2map -> odomAMCL使用AMCL参数配置文件amcl_config.yaml效果过程中的知识点一、launch文件编写格式及方法…

Python 之 NumPy 切片索引和广播机制

文章目录一、切片和索引1. 一维数组2. 二维数组二、索引的高级操作1. 整数数组索引2. 布尔数组索引三、广播机制1. 广播机制规则2. 对于广播规则另一种简单理解一、切片和索引 ndarray 对象的内容可以通过索引或切片来访问和修改&#xff08;&#xff09;&#xff0c;与 Pytho…

30、基于51单片机交通灯车流量管控数码管显示系统设计

摘要 随着社会主义的建设&#xff0c;城市的规模在不断扩大&#xff0c;城市的交通也在不断的提高和改进&#xff0c;交通的顺畅已经成为制约社会主义建设的一个重要因素。目前&#xff0c;伴随着机动车辆的不断增加&#xff0c;尤其是十字路口的交通建设 颇为关键&#xff0c…

PID控制算法简介

目录 1 简介 2 比例Proportional 3 积分Integral 4 微分Differential 5 公式 6 积分限幅 7 积分限行 8 相关代码 1 简介 PID控制中有P、I、D三个参数&#xff0c;PID即&#xff1a;Proportional&#xff08;比例&#xff09;、Integral&#xff08;积分&#…

【渝偲医药】实验室关于核磁共振波谱NMR的知识(原理、用途、分析、问题)

核磁共振波谱法&#xff08;Nuclear Magnetic Resonance&#xff0c;简写为NMR&#xff09;与紫外吸收光谱、红外吸收光谱、质谱被人们称为“四谱"&#xff0c;是对各种有机和无机物的成分、结构进行定性分析的强有力的工具之一&#xff0c;亦可进行定量分析。 核磁共振&…

目标检测的旋框框文献学习

这是最近打算看完的文献&#xff0c;一天一篇 接下来将记录一下文献阅读笔记&#xff0c;避免过两天就忘了 RRPN 论文题目&#xff1a;Arbitrary-Oriented Scene Text Detection via Rotation Proposals 论文题目&#xff1a;通过旋转方案进行任意方向的场景文本检测&#x…

深度学习刷 SOTA 有哪些 trick?

“深度学习刷 SOTA 有哪些 trick&#xff1f;”&#xff0c;此问题在知乎上有超 1700 人关注&#xff0c;浏览量超 32 万&#xff0c;相信是大家都非常关心的问题&#xff0c;快一起看看下面的分享吧&#xff0c;希望可以帮助到大家~对于图像分类任务&#xff0c;让我们以 Swin…

阿里前端必会手写面试题汇总

实现节流函数&#xff08;throttle&#xff09; 节流函数原理:指频繁触发事件时&#xff0c;只会在指定的时间段内执行事件回调&#xff0c;即触发事件间隔大于等于指定的时间才会执行回调函数。总结起来就是&#xff1a; 事件&#xff0c;按照一段时间的间隔来进行触发 。 像d…

啪,还敢抛出异常

&#x1f649; 作者简介&#xff1a; 全栈领域新星创作者 &#xff1b;天天被业务折腾得死去活来的同时依然保有对各项技术热忱的追求&#xff0c;把分享变成一种习惯&#xff0c;再小的帆也能远航。 &#x1f3e1; 个人主页&#xff1a;xiezhr的个人主页 前言 去年又重新刷了…

DELL游匣ubuntu2004系统 RTX3060显卡,cuda11.4,cudnn8.2.4安装

1.安装Ubuntu2004的系统2.驱动安装前的准备工作第一步&#xff1a;修改设置下载源~阿里源。在Software Updater在第一栏Ubuntu Software页面中&#xff0c;找到Download from&#xff0c;选择->China->mirrors.aliyun.com,点击确认。第二步&#xff1a;sudo apt-get upda…

都说爱有回音,这次情人节驱动人生宠你!

来了来了&#xff0c;它又来了——那个一波人狂欢&#xff0c;一波人孤单的节日。 眼看着身边人在订花订餐厅&#xff0c;选礼物&#xff0c;空气中弥漫着微妙的氛围&#xff0c;驱动哥脑海里只有明天下班的地铁挤不挤得过这群约会的人。 不过根据哥的观察&#xff0c;发现一个…

【GlobalMapper精品教程】046:空间操作(3)——并集(Union)

本文讲解globalmapper空间操作中一种很重要的工具:并集。 文章目录 一、工具介绍1. 并集原理2. GM并集工具二、案例演示1. 加载数据2. 并集运算三、结果分析1. 空间变化2. 属性表变化3. 空间和属性对应关系一、工具介绍 1. 并集原理 并集(union)操作创建由两个输入图层的所…

80 90后表示真干不过,部门新来的00后已经把我卷奔溃了,不想干了····

都说00后躺平了&#xff0c;但是有一说一&#xff0c;该卷的还是卷。这不&#xff0c;刚开年我们公司来了个00后&#xff0c;工作没两年&#xff0c;跳槽到我们公司起薪18K&#xff0c;都快接近我了。 后来才知道人家是个卷王&#xff0c;从早干到晚就差搬张床到工位睡觉了。 …