LeetCode解法汇总2182. 构造限制重复的字符串

目录链接:

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

GitHub同步刷题项目:

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

原题链接:

力扣(LeetCode)官网 - 全球极客挚爱的技术成长平台


描述:

给你一个字符串 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 <= 105
  • s 由小写英文字母组成

解题思路:

这里字符串顺序和最终结果无关,所以我们可以使用长度为26的数组,记录每个字符出现的数量,方便后续使用。

可以使用递归的思路,构造一个方法负责拼接字符串。传入值为当前最大的字符位置,然后进行循环,每次选择补充repeatLimit数量的当前剩余最大字符和次大字符,如果补充成功,则继续,否则跳出循环。

当所有字符串都补充完整后,结果就是最终补充完整的字符串。

代码:

class Solution2182
{
public:
    string outStr = "";
    string repeatLimitedString(string s, int repeatLimit)
    {

        vector<int> nums(26);
        const char *c = s.c_str();
        while (*c != '\0')
        {
            char currentChar = *c;
            nums[currentChar - 'a']++;
            c++;
        }

        int index = 25;
        while (index >= 0)
        {
            if (nums[index] == 0)
            {
                index--;
                continue;
            }
            int nextIndex = repeatLimitedOneChar(nums, repeatLimit, index);
            index = nextIndex;
        }
        return outStr;
    }

    int repeatLimitedOneChar(vector<int> &nums, int repeatLimit, int index)
    {
        int nextIndex = index - 1;
        while (nums[index] > 0)
        {
            int num = min(repeatLimit, nums[index]);
            for (int i = 0; i < num; i++)
            {
                outStr += (char)('a' + index);
            }
            nums[index] -= num;
            if (nums[index] == 0 || index == 0)
            {
                break;
            }
            while (nextIndex >= 0 && nums[nextIndex] == 0)
            {
                nextIndex--;
            }
            if (nextIndex < 0)
            {
                return nextIndex;
            }
            outStr += (char)('a' + nextIndex);
            nums[nextIndex] -= 1;
        }
        return nextIndex;
    }
};

相关推荐

  1. LeetCode解法汇总2182. 构造限制重复字符串

    2024-01-21 04:44:04       43 阅读
  2. leetcode-2182.构造限制重复字符串

    2024-01-21 04:44:04       40 阅读
  3. 【力扣每日一题】力扣2182构造限制重复字符串

    2024-01-21 04:44:04       39 阅读
  4. Leetcode459:重复字符串

    2024-01-21 04:44:04       43 阅读

最近更新

  1. TCP协议是安全的吗?

    2024-01-21 04:44:04       19 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-01-21 04:44:04       19 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-01-21 04:44:04       19 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-01-21 04:44:04       20 阅读

热门阅读

  1. 输出一个水仙花数

    2024-01-21 04:44:04       37 阅读
  2. SpringCloud Stream配置详解

    2024-01-21 04:44:04       33 阅读
  3. Spring中@Async的使用技巧

    2024-01-21 04:44:04       42 阅读
  4. 洛谷 P8218 【深进1.例1】求区间和 c语言

    2024-01-21 04:44:04       25 阅读
  5. 2024 前端高频面试题之 浏览器原理 篇

    2024-01-21 04:44:04       41 阅读
  6. c++ STL

    2024-01-21 04:44:04       34 阅读
  7. C++从零开始的打怪升级之路(day16)

    2024-01-21 04:44:04       36 阅读
  8. SpringBoot-03

    2024-01-21 04:44:04       37 阅读
  9. C++中的new/delete

    2024-01-21 04:44:04       40 阅读
  10. Spring DI

    Spring DI

    2024-01-21 04:44:04      38 阅读