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 协议 ,转载请注明出处!