首页 > 编程语言 >【教3妹学编程-算法题】构造限制重复的字符串

【教3妹学编程-算法题】构造限制重复的字符串

时间:2024-01-13 19:33:18浏览次数:31  
标签:字符 repeatLimitedString 字母 编程 妹学 算法 repeatLimit 字符串 字典

【教3妹学编程-算法题】构造限制重复的字符串_重置

3妹:“太阳当空照,花儿对我笑,小鸟说早早早,你为什么背上炸药包”

2哥 :3妹,什么事呀这么开森。

3妹:2哥你看今天的天气多好啊,最近一周都是大晴天,艳阳高照

2哥:是啊,天气不冷不热的,很适合生活

3妹:据说南方的小土豆都跑到北方滑雪了,哈哈哈哈

2哥:泼水成冰好玩是好玩,但是一定要注意防寒哦,看新闻都有人冻伤了。

3妹:是啊,还是待在室内比较好

2哥:给你出了一道题发你微信里了, 上班通勤的路上记得看一下,回来问你答案~

【教3妹学编程-算法题】构造限制重复的字符串_重置_02

3妹:知道啦,难不倒我!

题目:

给你一个字符串 s 和一个整数 repeatLimit ,用 s 中的字符构造一个新字符串 repeatLimitedString ,使任何字母 连续 出现的次数都不超过 repeatLimit 次。你不必使用 s 中的全部字符。

返回 字典序最大的 repeatLimitedString 。

如果在字符串 a 和 b 不同的第一个位置,字符串 a 中的字母在字母表中出现时间比字符串 b 对应的字母晚,则认为字符串 a 比字符串 b 字典序更大 。如果字符串中前 min(a.length, b.length) 个字符都相同,那么较长的字符串字典序更大。

示例 1:

输入:s = "cczazcc", repeatLimit = 3输出:"zzcccac" 解释:使用 s 中的所有字符来构造 repeatLimitedString "zzcccac"。 字母 'a' 连续出现至多 1 次。 字母 'c' 连续出现至多 3 次。 字母 'z' 连续出现至多 2 次。 因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。 该字符串是字典序最大的 repeatLimitedString ,所以返回 "zzcccac" 。 注意,尽管 "zzcccca" 字典序更大,但字母 'c' 连续出现超过 3 次,所以它不是一个有效的 repeatLimitedString 。 示例 2:

输入:s = "aababab", repeatLimit = 2输出:"bbabaa" 解释: 使用 s 中的一些字符来构造 repeatLimitedString "bbabaa"。 字母 'a' 连续出现至多 2 次。 字母 'b' 连续出现至多 2 次。 因此,没有字母连续出现超过 repeatLimit 次,字符串是一个有效的 repeatLimitedString 。 该字符串是字典序最大的 repeatLimitedString ,所以返回 "bbabaa" 。 注意,尽管 "bbabaaa" 字典序更大,但字母 'a' 连续出现超过 2 次,所以它不是一个有效的 repeatLimitedString 。

提示:

1 <= repeatLimit <= s.length <= 10^5s 由小写英文字母组成

思路:

【教3妹学编程-算法题】构造限制重复的字符串_重置_03

贪心 + 双指针,

我们可以按照如下的方式构造字符串,这样构造出的字符串对应的字典序一定是最大的:

每次选择当前剩余的字典序最大的字符加到字符串末尾;如果字符串末尾的字符已经连续出现了 repeatLimit 次,则将字典序次大的字符加到字符串末尾,随后继续选择当前剩余的字典序最大的字符加到字符串末尾,直至使用完字符或没有新的字符可以合法加入。

java代码:

class Solution {
    static public int N = 26;
    public String repeatLimitedString(String s, int repeatLimit) {
        int[] count = new int[N];
        for (int i = 0; i < s.length(); i++) {
            count[s.charAt(i) - 'a']++;
        }
        StringBuilder ret = new StringBuilder();
        int m = 0;
        for (int i = N - 1, j = N - 2; i >= 0 && j >= 0;) {
            if (count[i] == 0) { // 当前字符已经填完,填入后面的字符,重置 m
                m = 0;
                i--;
            } else if (m < repeatLimit) { // 当前字符未超过限制
                count[i]--;
                ret.append((char)('a' + i));
                m++;
            } else if (j >= i || count[j] == 0) { // 当前字符已经超过限制,查找可填入的其他字符
                j--;
            } else { // 当前字符已经超过限制,填入其他字符,并且重置 m
                count[j]--;
                ret.append((char)('a' + j));
                m = 0;
            }
        }
        return ret.toString();
    }
}

标签:字符,repeatLimitedString,字母,编程,妹学,算法,repeatLimit,字符串,字典
From: https://blog.51cto.com/u_6813689/9233018

相关文章

  • 《Java编程思想第四版》学习笔记54--关于UncaughtExceptionHandler
    Java中在处理异常的时候,通常的做法是使用try-catch-finally来包含代码块,但是Java自身还有一种方式可以处理——使用UncaughtExceptionHandler。它能检测出某个线程由于未捕获的异常而终结的情况。当一个线程由于未捕获异常而退出时,JVM会把这个事件报告给应用程序提供的UncaughtExce......
  • 学了这么多编程语言,你学会了几种“Hello world”呢?
    学了这么多编程语言,你学会了几种“Helloworld”呢?王菜鸟于2020-05-0921:53:48发布阅读量2.1k收藏2点赞数15分类专栏:随笔记录文章标签:编程语言版权随笔记录专栏收录该内容31篇文章2订阅订阅专栏你知道多少种编程语言?本文整理了30种编程语言的HelloWorld程序,有些......
  • 算法学习Day26组合总和、分割回文串
    Day26组合总和、分割回文串ByHQWQF2024/01/13笔记39.组合总和给定一个无重复元素的数组candidates和一个目标数target,找出candidates中所有可以使数字和为target的组合。candidates中的数字可以无限制重复被选取。说明:所有数字(包括target)都是正整数。解集......
  • socket编程 [补档-2023-07-10]
    Linux网络编程1.socket编程socket是一种通信机制,用于在网络中不同计算机之间进行数据传输,当然也可用用于进程间通信。在linux中,有文件描述符这么个东西,我们可以通过socket函数创建一个网络连接,socket的返回值为一个文件描述符,我们拿到这个文件描述符就可以像操作普通io文件那样......
  • 【SPFA】最短路的一种算法
    SPFA算法是在bellman-ford算法基础上优化而来,所以我们先讨论bellman-ford算法bellman-ford算法的核心是‘松弛’。那么什么是松弛呢?以下图为例:假设数组d[i]表示源点s到达结点i的最短路径长度,那么松弛指的就是当d[a]+w<d[b],也就是说,这时候通过a到达b比原来的路径更......
  • (坚持每天写算法)基础算法复习与学习part1基础算法1-7——高精度减法(处理t=1和t>1代码的
    题目:思路:这一道题其实和高精度加法的思路是差不多的,都是使用算式进行模拟。重点:关于代码怎么写,在高精度加法那里还看不太出来(我也没有写),但是在高精度减法这里就完全可以看出来了。我们在加法算式里面,一般是A[i]+B[i]+t,但是也可以这么写:t+A[i]+B[i],我们可以先写进位......
  • 【LeetCode 2701. 连续递增交易】MySQL用户变量编程得到严格递增连续子序列的开始位置
    题目地址https://leetcode.cn/problems/consecutive-transactions-with-increasing-amounts/代码#WriteyourMySQLquerystatementbelowwitht1as(select*#--------------------------只需要改动这里的逻辑,其他不要动。注意里面的语句是“顺序执行的......
  • 实验七:Spark机器学习库Mtlib编程实践
    1、数据导入导入相关的jar包:importorg.apache.spark.ml.feature.PCAimportorg.apache.spark.sql.Rowimportorg.apache.spark.ml.linalg.{Vector,Vectors}importorg.apache.spark.ml.evaluation.MulticlassClassificationEvaluatorimportorg.apache.spark.ml.{Pipeline,......
  • 【Leetcode 2474. 购买量严格增加的客户】MySQL用户变量编程解决严格递增连续子序列问
    题目地址https://leetcode.cn/problems/customers-with-strictly-increasing-purchases/description/代码#WriteyourMySQLquerystatementbelowwitht1as(selectcustomer_id,year(order_date)asmy_year,sum(price)astotal_spendfromOrders......
  • Shell编程自动化之if、for、while和函数
    一、if语句1.单分支格式if[条件判断式];then当条件判断成立时,执行的命令内容fiif[条件判断式]then当条件判断成立时,执行的命令内容fi2.双分支格式if[条件判断式];then当条件判断成立时,执行的命令内容else当条件判断......