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


    1. class Solution {
    2. //应当尽量选择后面的字母
    3. public String repeatLimitedString(String s, int repeatLimit) {
    4. StringBuilder res = new StringBuilder();
    5. int[] cnt = new int[26];
    6. char[] ch = s.toCharArray();
    7. for (char c : ch) cnt[c-'a']++;
    8. for (int i = 25; i >= 0; i--) {
    9. while (true) {
    10. int c = Math.min(cnt[i], repeatLimit);
    11. for (int k = 0; k < c; k++)
    12. res.append((char)('a' + i));
    13. cnt[i] -= c;
    14. if (cnt[i] == 0) break; //当前字母用完
    15. //没有用完,我们就往前找一个字母隔在中间,然后继续用当前字母
    16. int u = i-1;
    17. for (; u >= 0; u--)
    18. if (cnt[u] > 0) break;
    19. if (u == -1) break; //表示没有前面的字母了,已经不能再拼了
    20. res.append((char)(u + 'a'));
    21. cnt[u]--;
    22. }
    23. }
    24. return res.toString();
    25. }
    26. }