leetcode刷题记录-1405. 最长快乐字符串

「这是我参与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

题解

贪心

按照题目的要求,我们需要通过给我们的三个字母的个数组合得到最长的开心字符串,我们可以运用贪心的思维,尽可能多的使用当前最多的字母,因为字符串需要不出现三个重复的字符,所以我们可以在满足这个条件前提下,尽可能多的使用当前最多的字母。然后我们可以用一个数组来保存成功后的数据,最后再把他们连接起来。

  1. 我们用一个二维数组来保存下题目给的每一个字母的个数:
const arr = [
[a, "a"],
[b, "b"],
[c, "c"],
];
复制代码
  1. 然后进行循环,并且定义一个退出循环的条件:let hasNext = false,只有当满足上述的所以进行下一步的条件时,才会把这个值改为true。

  2. 如果当前循环的个数最多的字母,满足不超过三个重复的条件,就把循环条件改为true,并且加入答案数组,并且这个字母的个数要减一。如果不满足条件则退出并且循环个数第二大的字母,以此类推。

  3. 最后将得到的答案数组连接起来,就是题目需要的最长快乐字符串。

/**
 * @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("");
};
复制代码

image.png

Guess you like

Origin juejin.im/post/7061976904227618823