[M模拟] lc2182. 构造限制重复的字符串(贪心+模拟+复看)

文章目录

    • 1. 题目来源
    • 2. 题目解析

1. 题目来源

链接:2182. 构造限制重复的字符串
力扣题解:[C++] 贪心+模拟,分类讨论,注释清晰

2. 题目解析

很明显贪心,有最大尽可能多的填最大,发现达到限制数后,就换个次大值进来,接着尽可能多的填最大。
这里就有两个想法:
1- 直接哈希计数后,根据规则,构造结果字符串
2- sort 排序后,原字符串进行判断、交换等操作,获取结果(仔细想想异常情况太多,没考虑了)

这里需要体会下与官解双指针写法的不通,感觉那个更优雅点…这种写法把算法题写成了纯业务题…


  • 时间复杂度 O ( n ) O(n) O(n) 感觉是,会比 O(n) 大,因为可能存在一些无效的遍历
  • 空间复杂度 O ( 1 ) O(1) O(1)

class Solution {
public:
    string repeatLimitedString(string s, int repeatLimit) {
        int um[26] = {0};
        for (char &c : s) um[c - 'a'] ++ ;  // 哈希计数

        string res = "";
        int last = -1, cnt = -1;    // last:当前构造字符串的末尾元素,cnt:当前构造字符串的末尾连续元素个数
        while (1) {
            bool out = true;        // 是否构造完毕标志
            for (int i = 25; i >= 0; i -- ) {   // 逆序构造结果
                if (um[i] == 0) continue ;

                if (cnt == repeatLimit) { // 如果连续元素已经满了,需要找下一个合适的字符
                    if (i != last && um[i] > 0) { // 筛选规则:下一个与当前不同,且字符尽可能大,配合上逆序添加的性质,只要遇到第一个不和末尾字符相同的可用字符即可,这里只需要一个字符
                        res += string(1, i + 'a');
                        um[i] -- ;
                        last = i, cnt = 1;
                        out = false;
                        break;
                    }
                } else {    // 末尾元素没满,看看当前元素可以放几个进去
                    if (um[i] >= repeatLimit) { // 如果当前元素较多,大于了限制数
                        if (last != i) {        // 如果末尾和当前待放入的元素不同,则直接放满限制数个字符
                            res += string(repeatLimit, i + 'a');
                            um[i] -= repeatLimit;
                            last = i, cnt = repeatLimit;    // 更新末尾元素,更新连续元素个数
                            out = false;
                        } else {    // 如果末尾和当前待放入的元素相同,那么只能放入一部分,该部分和末尾字符加在一起补充满限制数
                            int t = repeatLimit - cnt;
                            res += string(t, i + 'a');
                            um[i] -= t;
                            last = i, cnt = repeatLimit;    // 更新末尾元素,更新连续元素个数
                            out = false;
                        }
                    } else {    // 如果末尾元素不是很多,少于限制数
                        // if (last != i) {    // 如果末尾和当前待放入的元素不同,则直接放满限制数即可
                            res += string(um[i], i + 'a');
                            um[i] = 0;
                            last = i, cnt = um[i];
                            out = false;
                        // } else {   // 如果末尾和当前待放入的元素相同,那么也要考虑剩余部分放进入会不会导致超出限制,只能放入一部分,补充满限制数字符
                        //     int t = um[i] + cnt > repeatLimit ? repeatLimit - cnt : um[i];
                        //     res += string(t, i + 'a');
                        //     um[i] -= t;
                        //     last = i, cnt += t;
                        //     out = false;
                        // }

                        // 这里将上面代码注释的原因:该场景存在,但不用分类讨论,因为不会超过限制,直接添加所有字符即可
                        // 因为走到 else 逻辑, um[i] 肯定小于限制,且当前的 i 即便和 last 同一个字符,但此时的last只有一个字符
                        // 填充了多个字符--》选择次大值--》刚好次大值选中了当前的这个字符,填充一个--》该字符元素没超过限制数--》该字符走到当前逻辑
                        // 所以,只有一个字符的情况下,且剩余字符数本身就小于限制数,所以直接将剩余的所有字符全部添加进去即可

                    }
                }
            }
            if (out) return res;
        }

        return "";
    }
};

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

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

相关文章

美力AI变革:生成式AI在美妆和时尚领域的巨大改变

美妆AI技术解决方案提供商—玩美移动于今日发布最新全球趋势报告:《生成式AI在美妆和时尚领域的巨大改变》,就生成式AI在美妆和时尚行业的崛起,为品牌商提供了富有洞见的深入分析。该报告分析了来自玩美移动屡获殊荣的玩美系列APP应用套件的大…

imx6ull基于yocto工程的l汇编点亮ed

通过汇编点亮led 在裸机状态下通过汇编点亮led,即没有操作系统,(uboot kernel rootfs 都不需要实现)。 led点亮原理 1.GPIO复用 根据原理图,找到led对应的引脚(pin),复用为GPIO(只有GPIO才能…

力扣热题100

排序 快速排序 #include <iostream> #include <vector> using namespace std;// 快速排序函数&#xff0c;传入引用&#xff0c;以便修改原始数组 void quick_sort(vector<int>& q, int l, int r) {// 边界条件&#xff1a;如果左边界大于等于右边界&am…

胶囊-药品广告数据库-解锁药品营销市场

随着医药技术的不断进步&#xff0c;药品市场的竞争也日益激烈&#xff0c;而「广告营销」一直以来都是医药企业发展过程中的重要环节&#xff0c;越来越多的药企意识到药品广告在品牌传播和营销方面的巨大潜力。 而一个好的药品广告投放方案往往需要进行全方位的市场调研&…

Linux Debian12使用VSCode和Python搭建flask开发环境

一、安装VSCode 在Linux Debian12系统上安装VSCode教程可以参考网上相关教程。 二、安装Python 打开VSCode&#xff0c;安装python和python扩展包&#xff0c;如下图所示&#xff1a; 三、创建Python虚拟环境 1.新建文件夹testFlask 2.用vscode打开文件夹testFlask&#xf…

Java副本的概念

在Java中&#xff0c;"副本"&#xff08;copy&#xff09;一词可以用于描述不同的概念&#xff0c;具体取决于上下文。以下是两个常见的用法&#xff1a; 对象的副本&#xff1a;在Java中&#xff0c;当你创建一个对象并将其赋值给另一个变量时&#xff0c;实际上是创…

Jetpack Compose -> 声明式UI Modifier

前言 本章主要介绍下 Compose 的声明式 UI 以及初级写法&#xff1b; 什么是声明式UI 传统UI 传统 UI 方式来声明UI <androidx.appcompat.widget.LinearLayoutCompat android:layout_width"match_parent" android:layout_height"match_parent&quo…

大数据调度框架Oozie,这个学习网站让你事半功倍!

Oozie是一个基于工作流引擎的开源框架&#xff0c;由Cloudera公司贡献给Apache。它主要用于管理和调度Apache Hadoop作业&#xff0c;支持的任务类型包括Hadoop MapReduce、Pig Jobs等。 Oozie的核心概念包括workflow jobs和coordinator jobs。Workflow jobs是由多个动作&#…

快递平台长期最低价格收费,需要寄快递享折扣优惠的请看这里 !

除了我们平时去菜鸟驿站寄快递或者在快递公司的官网上下单等方式外&#xff0c;我们还可以在我们平日使用的微信小程序中选择快递平台享受快递物流折扣。不用像其他主流快递公司想用优惠券一样下载官方APP。您还可以享受无忧特派送监管服务。今天给大家介绍一下我最常用的一款&…

鸿蒙开发已解决-Failed to connect to gitee.com port 443: Time out 连接超时提示

文章目录 项目场景:问题描述原因分析:解决方案:解决方案1解决方案2:解决方案3:此Bug解决方案总结解决方案总结**心得体会:解决连接超时问题的三种方案**项目场景: 导入Sample时遇到导入失败的情况,并提示“Failed to connect to gitee.com port 443: Time out”连接超…

用通俗易懂的方式讲解:大模型微调方法总结

大家好&#xff0c;今天给大家分享大模型微调方法&#xff1a;LoRA,Adapter,Prefix-tuning&#xff0c;P-tuning&#xff0c;Prompt-tuning。 文末有大模型一系列文章及技术交流方式&#xff0c;传统美德不要忘了&#xff0c;喜欢本文记得收藏、关注、点赞。 文章目录 1、LoRA…

“所有伙食开销统计:轻松查看,智能管理你的餐饮支出“

你是否经常为伙食开销感到困扰&#xff0c;不知道如何有效控制和管理&#xff1f;现在&#xff0c;有了我们的伙食开销统计工具&#xff0c;这些问题将得到轻松解决&#xff01; 首先第一步&#xff0c;我们要进入晨曦记账本并在上方功能栏里选择“查看方式”。并在弹出来的列表…

SpringBoot之优化高并发场景下的HttpClient并提升QPS

HttpClient优化思路 使用连接池&#xff08;简单粗暴&#xff09; 长连接优化&#xff08;特殊业务场景&#xff09; httpclient和httpget复用 合理的配置参数&#xff08;最大并发请求数&#xff0c;各种超时时间&#xff0c;重试次数&#xff09; 异步请求优化&#xff0…

gitlab导入/还原代码仓库(离线导入本地代码仓库及历史提交记录)

gitlab安装 在线 导入&#xff08;还原&#xff09;代码仓库 已有的代码代码可能托管于 GitHub、Bitbucket Cloud 、Bitbucket Server 、FogBugz 、Gitea 等平台&#xff0c;只要你有合适的权限&#xff0c;都可以使用 GitLab的在线导入功能直接从这些平台导入&#xff0c;如…

山西电力市场日前价格预测【2024-01-13】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2024-01-13&#xff09;山西电力市场全天平均日前电价为231.81元/MWh。其中&#xff0c;最高日前电价为345.71元/MWh&#xff0c;预计出现在00:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

声明式管理方法(yaml文件)

声明式管理方法&#xff08;yaml文件&#xff09; 声明式管理方法&#xff08;yaml文件&#xff09;&#xff1a; 1、适合对资源的修改操作 2、声明式管理依赖于yaml文件&#xff0c;所有的内容都在yaml文件当中声明 3、编辑好的yaml文件&#xff0c;还是要依靠陈述式的命令…

数据结构链表完整实现(负完整代码)

文章目录 前言引入1、链表定义及结构链表的分类3、单向不带头链表实现实现完整代码 4、带头双向循环链表实现实现完整代码 前言 引入 在上一篇文章中&#xff0c;我们认识了顺序表&#xff0c;但是在许多情况中&#xff0c;顺序表在处理一些事件时还存在许多问题&#xff0c;比…

计算机缺失msvcr100.dll如何修复?分享五种实测靠谱的方法

在计算机系统的日常运行与维护过程中&#xff0c;我们可能会遇到一种特定的故障场景&#xff0c;即系统中关键性动态链接库文件msvcr100.dll的丢失。msvcr100.dll是Microsoft Visual C Redistributable Package的一部分&#xff0c;对于许多基于Windows的应用程序来说&#xff…

增广路算法 DFS求解 最大网络流问题

最大网络流问题 最大网络流问题是这样的&#xff0c;有一个有向图&#xff0c;假定有一个源点&#xff0c;有一个汇点&#xff0c;源点有流量出来&#xff0c;汇点有流量进入&#xff0c;有向图上的边的权重为该条边可通过的最大流量(方向为边的方向)&#xff0c;问从源点到汇…

Servlet-Request

一、预览 在上一篇Servlet体系结构中&#xff0c;我们初步了解了怎么快速本篇将介绍Servlet中请求Request的相关内容&#xff0c;包括Request的体系结构&#xff0c;Request常用API。 二、Request体系结构 我们注意到我们定义的Servlet类若实现Servlet接口时&#xff0c;请求…
最新文章