题目链接
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是最大的满足j<i且cnt[j]>0的下标,知道取完所有字母。
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)