【LeetCode每日一题】2182. 构造限制重复的字符串

2024-1-13

文章目录

      • [2182. 构造限制重复的字符串](https://leetcode.cn/problems/construct-string-with-repeat-limit/)
          • 思路:

2182. 构造限制重复的字符串

在这里插入图片描述

思路:

按照字符出现次数从高到低的顺序进行重复,通过维护一个指针 j 来寻找下一个非零出现次数的字母。同时,利用 StringBuilder 对象可以高效地构建字符串,避免频繁的字符串拼接操作

  1. 首先,创建一个长度为26的数组 cnt,用于统计字符串 s 中每个字符出现的次数。数组的下标对应字母表中的字母,通过 s.charAt(i) - 'a' 可以得到字符在字母表中的位置,然后将对应位置的计数器加1。
  2. 创建一个 StringBuilder 对象 ans,用于构建最终结果。
  3. 从字母表的最后一个字母 ‘z’ 开始,依次处理每个字母。同时维护一个指针 j,初始值为当前字母的前一个字母下标 i-1
  4. 进入一个循环,直到当前字母的出现次数为0。在循环中,主要进行以下操作:
    • 将当前字母重复的次数与限制次数 repeatLimit 取较小值,设为变量 k。使用 for 循环遍历 k 次,将当前字母添加到 ans 中,并将字母的计数器减1。
    • 如果当前字母的出现次数为0,则跳出内部循环。
    • 在内部循环中,需要寻找下一个非零出现次数的字母,即从 j 开始向前搜索。如果找到了下一个字母(即 j >= 0 并且 cnt[j] != 0),则将其添加到 ans 中,并将该字母的计数器减1。
    • 如果找不到下一个字母,则跳出外部循环。
  5. 最终,返回 ans 构建的字符串作为结果。
    public String repeatLimitedString(String s, int repeatLimit) {
        // 创建一个长度为26的数组,用于统计字符串s中每个字符出现的次数
        int[] cnt = new int[26];
        for (int i = 0; i < s.length(); ++i) {
            ++cnt[s.charAt(i) - 'a'];
        }

        // 创建一个StringBuilder对象,用于构建最终结果
        StringBuilder ans = new StringBuilder();

        // 遍历字母表,从后往前依次处理每个字母
        for (int i = 25, j = 24; i >= 0; --i) {
            // j表示当前字母的前一个字母下标,初始值为i-1
            j = Math.min(j, i - 1);

            // 循环直到当前字母的出现次数为0
            while (true) {
                // 将当前字母重复的次数与限制次数取较小值,进行遍历并添加到结果中
                for (int k = Math.min(cnt[i], repeatLimit); k > 0; --k) {
                    ans.append((char) ('a' + i));
                    --cnt[i];
                }

                // 如果当前字母的出现次数为0,则跳出循环
                if (cnt[i] == 0) {
                    break;
                }

                // 寻找下一个非零出现次数的字母
                while (j >= 0 && cnt[j] == 0) {
                    --j;
                }

                // 如果找不到下一个字母,则跳出循环
                if (j < 0) {
                    break;
                }

                // 将下一个字母添加到结果中,并将其出现次数减1
                ans.append((char) ('a' + j));
                --cnt[j];
            }
        }

        // 返回最终结果
        return ans.toString();
    }

点击移步博客主页,欢迎光临~

偷cyk的图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【python】进阶--->MySQL数据库(二)

一、sql语句(结构化查询语言) 要和数据库进行交互,需要使用到数据库认识的语言 : sql语句 是关系型数据库都需要遵循的规范。不同数据库都支持sql语句,但是都有特有内容。 二、sql语句分类 数据定义语言 : 用来定义数据库–数据库,表,列. 数据操作语言 : 对数据库表中的记录进…

Modbus协议学习第一篇之基础概念

什么是“协议” 大白话解释&#xff1a;协议是用来正确传递消息数据而设立的一种规则。传递消息的双方&#xff08;两台计算机&#xff09;在通信时遵循同一种协议&#xff0c;即可理解彼此传递的消息数据。 Modbus协议模型 Modbus协议模型较为简单&#xff0c;使用一种称为应用…

Colab 谷歌免费的云端Python编程环境初体验

最新在学习AIGC的过程中&#xff0c;发现很多教程&#xff0c;demo使用到了Colab这个谷歌工具。 Colab 是什么&#xff1f; Google Colab是一个强大且免费的云端Python编程环境&#xff0c;为学生、研究人员和开发者提供了一个便捷的平台来开展数据科学、机器学习和深度学习项…

力扣(leetcode)第500题键盘行(Python)

500.键盘行 题目链接&#xff1a;500.键盘行 给你一个字符串数组 words &#xff0c;只返回可以使用在 美式键盘 同一行的字母打印出来的单词。键盘如下图所示。 美式键盘 中&#xff1a; 第一行由字符 “qwertyuiop” 组成。 第二行由字符 “asdfghjkl” 组成。 第三行由字…

桌面显示器type-c接口方案6020

TYPE-C接口桌面显示器&#xff0c;与传统的显示器不同的是 新一类的显示器不仅仅支持视频传输&#xff0c;还可以利用显示器的DC电源转成PD协议充电给设备端&#xff08;笔记本&#xff0c;任天堂等HOST设备&#xff09;充电。 这种新型的TYPE-C接口桌面显示器&#xff0c;不仅…

C++核心编程之类和对象---C++面向对象的三大特性--继承

目录 一、继承 1. 继承的概念 2. 继承的定义 3. 类与类之间的关系 4. 继承的两类关系 二、继承方式的基本语法 总而言之&#xff0c;父类的私有内容&#xff0c;子类是访问不到的。 三、继承中的对象模型 父类中的私有属性被编译器隐藏&#xff0c;访问不到&#xff0c…

使用FreeBASIC设计8051单片机汇编编译器

在STC论坛上看到有人用C语言实现8051汇编编译器&#xff08;源码&#xff09;&#xff0c;好奇下&#xff0c;试着用FB写了一下。 基本原理就是通过分析汇编文件然后转换为机器码。以下是51汇编与机器码对应的表格&#xff08;数据来自网络&#xff0c;如果发现有误请联系QQ149…

记录:排查create_ap偶发无法开启自发AP的问题

背景说明&#xff1a; 系统&#xff1a;Xubuntu16.04&#xff1b;内核&#xff1a;4.14&#xff1b;无线网卡&#xff1a;EDIMAX EW-7822UAC 关于无线网卡的驱动安装和create_ap配置参考博文&#xff1a;Xubuntu16.04系统中使用EDIMAX EW-7822UAC无线网卡开启5G自发AP 目录 问题…

【Linux笔记】自定义一个简单的shell

一、命令行解释器shell的原理 我们已经知道Linux给我们提供了一系列由exec开头的系统调用接口&#xff0c;可以让我们在自己所写的程序中调用各种指令或者我们自己写的其他程序&#xff1a; 而我们的shell命令行解释器也是接收用户输入的指令&#xff0c;然后执行&#xff1a;…

Java 实现单链表

文章目录 节点类定义单链表类总结 单链表是一种常用的数据结构&#xff0c;它由若干个节点&#xff08;Node&#xff09;组成&#xff0c;每个节点包含两部分&#xff1a;一部分是数据域&#xff0c;用于存储数据&#xff1b;另一部分是指针域&#xff0c;用于指向下一个节点。…

spring常见漏洞(1)

简介 Spring的英文翻译为春天&#xff0c;可以说是给Java程序员带来了春天&#xff0c;因为它极大的简化了开发。得出一个公式&#xff1a;Spring 春天 Java程序员的春天 简化开发。最后的简化开发正是Spring框架带来的最大好处。 Spring是一个开放源代码的设计层面框架&a…

使用RNN完成IMDB电影评论情感分析

使用RNN完成IMDB电影评论情感分析 任务描述一、环境设置二、数据准备2.1 参数设置2.2 用padding的方式对齐数据2.3 用Dataset与DataLoader加载三、模型配置四、模型训练五、模型评估六、模型预测 任务描述 本示例教程演示如何在IMDB数据集上使用RNN网络完成文本分类的任务。IM…

react native中使用tailwind并配置自动补全

使用的第三方库是tailwind-react-native-classnames&#xff0c;同类的也有tailwind-rn&#xff0c;但是我更喜欢前者官方demo&#xff1a; import { View, Text } from react-native; import tw from twrnc;const MyComponent () > (<View style{twp-4 android:pt-2 b…

51-12 多模态论文串讲—BLIP 论文精读

视觉语言预训练VLP模型最近在各种多模态下游任务上获得了巨大的成功&#xff0c;目前还有两个主要局限性: (1) 模型角度: 大多数方法要么采用encoder模型&#xff0c;要么采用encoder-decoder模型。然而&#xff0c;基于编码器的模型不太容易直接转换到文本生成任务&#xff0…

爬虫之牛刀小试(四):爬取B站番剧的简介

今天爬取的是b站。 如何爬取b站中的番剧呢&#xff1f; 首先我们来到番剧索引中&#xff0c;随便点开一部动漫&#xff0c;检查代码。 每个作品对应一个链接: https://www.bilibili.com/bangumi/play/ss…&#xff08;ss后面的数字称为ss号&#xff09; 发现关于动漫的信息…

HTML--超链接

超链接 作用&#xff1a;点击跳转到相应位置 a标签 语法&#xff1a; <a href"链接地址">文本或图片</a>范例&#xff1a; <!DOCTYPE html> <html> <head> <meta charset"utf-8"/><title>跳转到百度</t…

程序员如何弯道超车?周末有奇效

作为一名程序员&#xff0c;不断提升自己的技能和知识是至关重要的。然而&#xff0c;在繁忙的工作日常中&#xff0c;很难有足够的时间和精力来学习新技术或深入研究。因此&#xff0c;周末成为了一个理想的时机&#xff0c;可以专注于个人发展和技能提升。所以程序员如何利用…

部署Tomcat及其负载均衡

简介 在前面已经学习了Nginx服务器的安装配置&#xff0c;本章主要采用案例课的形式介绍Tomcat及NginxTomcat负载均衡群集。Tomcat案例首先介绍其应用场景&#xff0c;然后重点介绍Tomcat的安装配置&#xff0c;NginxTomcat负载均衡群集案例是应用于生产环境下的一套可靠的Web站…

006集 正则表达式 re 应用实例—python基础入门实例

正则表达式指预先定义好一个 “ 字符串模板 ” &#xff0c;通过这个 “ 字符串模 板” 可以匹配、查找和替换那些匹配 “ 字符串模板 ” 的字符串。 Python的中 re 模块&#xff0c;主要是用来处理正则表达式&#xff0c;还可以利用 re 模块通过正则表达式来进行网页数据的爬取…

NUS CS1101S:SICP JavaScript 描述:三、模块化、对象和状态

原文&#xff1a;3 Modularity, Objects, and State 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 变化中安宁 &#xff08;即使它在变化&#xff0c;它仍然保持不变。&#xff09; ——赫拉克利特 变化越大&#xff0c;越是相同。 ——阿方斯卡尔 前面的章节介绍了构…