题目地址:https://leetcode-cn.com/problems/longest-happy-string/

题目描述

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

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

  • s 是一个尽可能长的快乐字符串。
  • s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
  • s 中只含有 'a'、'b' 、'c' 三种字母。

如果不存在这样的字符串 s ,请返回一个空字符串 ""。

示例1:

输入:a = 1, b = 1, c = 7
输出:"ccaccbcc"
解释:"ccbccacc" 也是一种正确答案。

示例2:

输入:a = 2, b = 2, c = 1
输出:"aabbc"

示例3:

输入:a = 7, b = 1, c = 0
输出:"aabaa"
解释:这是该测试用例的唯一正确答案。

提示:

1、 0<=a,b,c<=100
2、 a+b+c>0

题目大意

a个字母 'a'、b 个字母 'b'、c 个字母 'c',不准出现连续三个相同的字母。可以够成的最长的字符串是什么。

解题方法

贪心

做法:在保证没有连续三个字符相等的情况下,不停地从 a, b, c 中优先使用剩余次数最多的那个字符添加到结果 res 中。

1、 使用数组表示出a,b,c的次数和字符的对应关系,防止排序搞混乱了;
2、 判断某个字符x能否添加到res最后的方法是,res长度<2或者res的最后两个字符至少有一个不等于x.;
3、 只要a,b,c没用完,就一直循环,从数组中优先拿出现次数最多的如果该字符不能添加,就判断下一个,如果都不能添加则终止;

解释下for...break...else语句:如果 for 循环中没有调用 break,那么使用 else 。

Python 代码如下。

class Solution:
    def longestDiverseString(self, a: int, b: int, c: int) -> str:
        d = [[a, "a"], [b, "b"], [c, "c"]]
        total = a + b + c
        res = ""
        def canAdd(res, x):
            return len(res) < 2 or res[-1] != x or res[-2] != x
        while total > 0:
            d.sort(reverse=True)
            for i, (count, char) in enumerate(d):
                if count == 0: continue
                if canAdd(res, char):
                    res += char
                    d[i][0] -= 1
                    total -= 1
                    break
            else:
                break
        return res

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

DDKK.COM 弟弟快看-教程,程序员编程资料站,版权归原作者所有

本文经作者:负雪明烛 授权发布,任何组织或个人未经作者授权不得转发