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

这篇具有很好参考价值的文章主要介绍了【LeetCode每日一题】2182. 构造限制重复的字符串。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

2024-1-13

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

【LeetCode每日一题】2182. 构造限制重复的字符串,LeetCode,leetcode,数据库,算法

思路:

按照字符出现次数从高到低的顺序进行重复,通过维护一个指针 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();
    }

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

【LeetCode每日一题】2182. 构造限制重复的字符串,LeetCode,leetcode,数据库,算法文章来源地址https://www.toymoban.com/news/detail-799964.html

到了这里,关于【LeetCode每日一题】2182. 构造限制重复的字符串的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • (动态规划) 剑指 Offer 48. 最长不含重复字符的子字符串 ——【Leetcode每日一题】

    难度:中等 请从字符串中找出一个最长的不包含重复字符的子字符串,计算该最长子字符串的长度。 示例 1: 输入: “abcabcbb” 输出: 3 解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。 示例 2: 输入: “bbbbb” 输出: 1 解释: 因为无重复字符的最长子串是 “b”,所

    2024年02月11日
    浏览(45)
  • (栈和队列) 1047. 删除字符串中的所有相邻重复项 ——【Leetcode每日一题】

    难度:简单 给出由小写字母组成的字符串 S , 重复项删除操作 会选择两个相邻且相同的字母,并删除它们。 在 S 上反复执行重复项删除操作,直到无法继续删除。 在完成所有重复项删除操作后返回最终的字符串。答案保证唯一。 示例: 输入 :“abbaca” 输出 :“ca” 解释

    2024年02月08日
    浏览(31)
  • 【LeetCode每日一题】2645. 构造有效字符串的最少插入数(计算组数+动态规划+考虑相邻字母)

    2024-1-11 2645. 构造有效字符串的最少插入数 方法一:计算组数 1.用count统计,能构成几组abc 2.如果当前字符大于之前字符,说明还在组内,不更新 3.如果当前字符小于等于之前字符,说明不是同一组的abc,组数更新 4.最终返回值:组数*3,再减去原本的字符数,就是要插入的次数

    2024年01月17日
    浏览(45)
  • ( 字符串) 205. 同构字符串 ——【Leetcode每日一题】

    难度:简单 给定两个字符串 s 和 t ,判断它们是否是同构的。 如果 s 中的字符可以按某种映射关系替换得到 t ,那么这两个字符串是同构的。 每个出现的字符都应当映射到另一个字符,同时不改变字符的顺序。不同字符不能映射到同一个字符上,相同字符只能映射到同一个

    2024年02月02日
    浏览(37)
  • LeetCode·每日一题·415. 字符串相加·模拟

    作者:小迅 链接:https://leetcode.cn/problems/add-strings/solutions/2347085/mo-ni-zhu-shi-chao-ji-xiang-xi-by-xun-ge-fges/ 来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。   题意 - 给定二个字符串,计算它们的和并同样以字符串形式返回。 直接从

    2024年02月16日
    浏览(30)
  • ( 字符串) 647. 回文子串 ——【Leetcode每日一题】

    难度:中等 给你一个字符串 s ,请你统计并返回这个字符串中 回文子串 的数目。 回文字符串 是正着读和倒过来读一样的字符串。 子字符串 是字符串中的由连续字符组成的一个序列。 具有不同开始位置或结束位置的子串,即使是由相同的字符组成,也会被视作不同的子串

    2024年02月01日
    浏览(31)
  • (贪心) 1221. 分割平衡字符串 ——【Leetcode每日一题】

    难度:简单 平衡字符串 中, \\\'L\\\' 和 \\\'R\\\' 字符的数量是相同的。 给你一个平衡字符串 s ,请你将它分割成尽可能多的子字符串,并满足: 每个子字符串都是平衡字符串。 返回可以通过分割得到的平衡字符串的 最大数量 。 示例 1: 输入:s = “RLRRLLRLRL” 输出:4 解释:s 可以分

    2024年02月11日
    浏览(25)
  • (字符串) 925. 长按键入 ——【Leetcode每日一题】

    难度:简单 你的朋友正在使用键盘输入他的名字 name 。偶尔,在键入字符 c 时,按键可能会被长按,而字符可能被输入 1 次或多次。 你将会检查键盘输入的字符 typed 。如果它对应的可能是你的朋友的名字(其中一些字符可能被长按),那么就返回 True 。 示例 1: 输入:na

    2024年02月09日
    浏览(47)
  • 【力扣·每日一题】2645. 构造有效字符串的最小插入数(动态规划 贪心 滚动数组优化 C++ Go)

    题目链接 给你一个字符串 word ,你可以向其中任何位置插入 “a”、“b” 或 “c” 任意次,返回使 word 有效 需要插入的最少字母数。 如果字符串可以由 “abc” 串联多次得到,则认为该字符串 有效 。 提示: 1 = w o r d . l e n g t h = 50 1 = word.length = 50 1 = w or d . l e n g t h = 50 w

    2024年01月16日
    浏览(37)
  • (字符串) 844. 比较含退格的字符串——【Leetcode每日一题】

    难度:简单 给定 s 和 t 两个字符串,当它们分别被输入到空白的文本编辑器后,如果两者相等,返回 true 。 # 代表退格字符。 注意 :如果对空文本输入退格字符,文本继续为空。 示例 1: 输入:s = “ab#c”, t = “ad#c” 输出:true 解释:s 和 t 都会变成 “ac”。 示例 2: 输入

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包