「这是我参与2022首次更文挑战的第12天,活动详情查看:2022首次更文挑战」
前言
今日的题目为中等,在上班的第一天做快乐字符串,leetcode真有你的...
每日一题
今天的每日一题 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"
解释:这是该测试用例的唯一正确答案。
复制代码
提示:
- 0 <= a, b, c <= 100
- a + b + c > 0
题解
贪心
按照题目的要求,我们需要通过给我们的三个字母的个数组合得到最长的开心字符串,我们可以运用贪心的思维,尽可能多的使用当前最多的字母,因为字符串需要不出现三个重复的字符,所以我们可以在满足这个条件前提下,尽可能多的使用当前最多的字母。然后我们可以用一个数组来保存成功后的数据,最后再把他们连接起来。
- 我们用一个二维数组来保存下题目给的每一个字母的个数:
const arr = [
[a, "a"],
[b, "b"],
[c, "c"],
];
复制代码
-
然后进行循环,并且定义一个退出循环的条件:
let hasNext = false
,只有当满足上述的所以进行下一步的条件时,才会把这个值改为true。 -
如果当前循环的个数最多的字母,满足不超过三个重复的条件,就把循环条件改为true,并且加入答案数组,并且这个字母的个数要减一。如果不满足条件则退出并且循环个数第二大的字母,以此类推。
-
最后将得到的答案数组连接起来,就是题目需要的最长快乐字符串。
/**
* @param {number} a
* @param {number} b
* @param {number} c
* @return {string}
*/
var longestDiverseString = function (a, b, c) {
const ans = [];
const arr = [
[a, "a"],
[b, "b"],
[c, "c"],
];
while (true) {
arr.sort((a, b) => b[0] - a[0]);
let hasNext = false;
for (const [i, [key, val]] of arr.entries()) {
if (key <= 0) {
break;
}
n = ans.length;
if (n >= 2 && ans[n - 2] === val && ans[n - 1] === val) {
continue;
}
hasNext = true;
ans.push(val);
arr[i][0]--;
break;
}
if (!hasNext) {
break;
}
}
return ans.join("");
};
复制代码