0
点赞
收藏
分享

微信扫一扫

leetcode(力扣) 1405. 最长快乐字符串 (一个神奇的思路 )

自由的美人鱼 2022-02-15 阅读 57

文章目录

题目描述

思路分析

这道题的关键就是看好题目要求,题目中只有 ‘a’ ‘b’ ‘c’ 三种字母,并且这三个字母 没有三连的情况 就是 ‘aaa’ 'bbb ‘ccc’ 的情况,并且可以 以任意形式进行组合。

要组成尽可能长的串,那思路就很清晰了,贪心嘛,先看那个字母给的最多,先用两个这个最多的字母,然后用一个第二多的字母,然后再重新排序看那个最多,依次循环。 这个重新排序的过程可能用到优先队列。

大多数都是这个 贪心+优先队列的思路。

不过我在写的时候调试出了点bug,所以直接换了一个比较有意思的思路。

假设给的字母 ,6个a 4个b 3个c。

  • 首先将a分组,两个a一组,则可以分成三组 分别是 aa aa aa,
  • 然后遍历次多的b, 每次将每个b放到分组里,aab,aab, aab
  • 此时b用了3个了。还剩一个 继续放进去了,就变成 aabb,aab,aab,
  • 这时候b用完了,该去用c了,这里要注意,在用c的时候,不要重新遍历上面的分组,也就是说c要从 第二个分组 aab开始,不要从第一个分组aabb开始。所以遍历3个c,就变成了 aabbc,aabc,aabc。然后融合一下这几个就行了。

这里还有个小问题,假如给的是 a = 1, b = 1, c = 7 按照上面的思路 分组好之后是 [‘cca’,‘ccb’,‘cc’,‘c’] 拼接之后是 ccaccbccc 可以发现 末尾变成三个c了,需要去掉一个,所以程序的最后一步就是处理这个末尾就行了。

完整代码

class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        ll = [[a,'a'],[b,'b'],[c,'c']]
        ll.sort(reverse=True)
        res = []
        num_max = ll[0][0]
        word_max = ll[0][1]
        # 分组最多的元素
        while num_max >1:
            res.append([word_max *2])
            num_max -=2
        if num_max == 1:
            res.append([word_max])

        # 分组最多的元素完成后,将每个元素逐次的加入到刚才分的组中,每次每组加一个元素
        # 将第二多的元素 每个元素加入
        j = 0
        for i in range(ll[1][0]):
            res[j].append(ll[1][1])
            j +=1

            if j == len(res)  :
                j = 0
        # 将第三多的元素 每个元素加入
        k = j
        for i in range(ll[2][0]):
            res[k].append(ll[2][1])
            k +=1

            if k == len(res)  :
                k = 0
        # 将二维数组变成字符串
        ans = ''
        for i in res:
            ans += ''.join(i)

        # 处理末尾字符的多余情况
        for i in range(len(ans) - 3):

            if ans[i] == ans[i+1] == ans[i+2]:
                ans = ans[:i+2] # 不含末尾
                break

        return ans```

举报

相关推荐

0 条评论