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

题目链接

2182. 构造限制重复的字符串 - 力扣(LeetCode)

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

解题思路

一、暴力破解

        1、使用一个列表map[26]存储不同字母出现的次数;

        2、从z-a遍历列表,并且输出,输出相同的字母的数量 < repeatLimitedString

        3、如果输出的字母大于repeatLimitedString,那么输出列表中下一个字母

没搞出来

二、贪心

用一个长度为26的数组cnt统计字符串s中每一个字符出现的次数,然后从小到大枚举字母表的第i个字母,每次去除最多的min(cnt[i],repratLimit)个字母i,如果取完之后cnt[i]还是大于0,继续取字母表中第j个字母,其中j是最大的满足j0的下标,知道取完所有字母。

class Solution:
    def repeatLimitedString(self, s: str, repeatLimit: int) -> str:
        cnt = [0] * 26
        for c in s:
           cnt[ord(c) - ord("a")] += 1
        ans = []
        j = 24
        for i in range(25,-1,-1):
            j=min(i-1,j)
            while 1:
                x = min(repeatLimit,cnt[i])
                cnt[i] -= x
                ans.append(ascii_lowercase[i] * x)
                if cnt[i] == 0:
                    break
                while j >= 0 and cnt[j] == 0:
                    j -= 1
                if j < 0:
                    break
                cnt[j] -= 1
                ans.append(ascii_lowercase[j])
        return "".join(ans)         

你可能感兴趣的:(leetcode,算法,职场和发展)