LeetCode每日一题(二)——【贪心 】

博客讨论了一种通过贪心算法来构造最长的「快乐字符串」的方法。给定a、b、c三个整数分别代表字母'a'、'b'、'c'的数量限制,目标是生成一个尽可能长的字符串,其中不允许出现'aaa'、'bbb'或'ccc'这样的连续子串。代码示例展示了如何按字母剩余数量从多到少的顺序添加,以避免形成不合法的连续子串。

题目:

如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:

s 是一个尽可能长的快乐字符串。
s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
s 中只含有 'a'、'b' 、'c' 三种字母。
如果不存在这样的字符串 s ,请返回一个空字符串 ""。

分析:

使用贪心算法:每次都选择剩下数量最多的字母添加 ,因为 数量少的字母需要用做中间隔着,这样才会最长。全局最优由局部最优构成。

附上网站大佬的python代码【自己写的太垃圾,后面优化!】:

class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        x = [[a, 'a'],[b, 'b'],[c,'c']]
        #print(sorted(x,reverse=True))
        res = ""
        while True:
            for num in sorted(x,reverse=True):
                if num[0] <= 0:
                    return res
                if len(res) >= 2 and res[-2:] == num[1] * 2:
                    continue
                res += num[1]
                num[0] -= 1
                break
        return res

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

peter123123123123

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值