1405. 最长快乐字符串

最长快乐字符串

题目描述:

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

给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 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”
解释:这是该测试用例的唯一正确答案。

思路:

贪心算法,每次选择个数最多的一个字母,如果连续两次使用相同字母,下次就需要使用第二多的字母。

代码:

func longestDiverseString(a int, b int, c int) string {
    ans := []byte{}
    cnt := []struct{ c int; ch byte }{{a, 'a'}, {b, 'b'}, {c, 'c'}}
    for {
        sort.Slice(cnt, func(i, j int) bool { return cnt[i].c > cnt[j].c })
        if cnt[0].c == 0{
            break
        }
        ans = append(ans, cnt[0].ch)
        cnt[0].c --;
        sort.Slice(cnt, func(i, j int) bool { return cnt[i].c > cnt[j].c })
        if cnt[0].c == 0{
            break
        }
        ans = append(ans, cnt[0].ch)
        cnt[0].c--
        if ans[len(ans)-1] == ans[len(ans)-2]{
            if(cnt[1].c) >0{
                ans = append(ans, cnt[1].ch)
                cnt[1].c--
            }else{
                break
            }
        }
    }
    return string(ans)
}

代码效率:

执行用时:0 ms, 在所有 Go 提交中击败了100.00%的用户
内存消耗:2 MB, 在所有 Go 提交中击败了82.41%的用户


本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!