leet-code 1405.最长快乐字符串

191 阅读2分钟

「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战

最长快乐字符串

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

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

  • s 是一个尽可能长的快乐字符串。
  • s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
  • s 中只含有 'a'、'b' 、'c' 三种字母。 如果不存在这样的字符串 s ,请返回一个空字符串 ""。

解题思路

  1. 根据题意 我们最终输出的字符串只能是 aabbcc这样的字符串,而不能是aaabbcc这样的字串,第一时间我们就想到使用其中最长的模块,每次使用之前我们都用sort进行降序进行排序,确保每次的调用都是最长的模块
    • 具体的我是使用数组进行存储我们需要使用的对象字段

      const keysList = [{value: a, key: 'a'},{value: b, key: 'b'},{value: c, key: 'c'}]
      
    • 创建两个变量,分别用于存储跳出循环的条件和,最终返回的字段

      let hasNext = true
      let str = ''
      
    • 依次从当前数量最多的字母开始尝试,如果发现加入当前字母会导致出现三个连续相同字母,则跳过当前字母,直到我们找到可以添加的字母为止。实际上每次只会在数量最多和次多的字母中选择一个。

      for(const val of keysList) {
          if(val.value <= 0) {
              hasNext = false
              break
          }
          // 注意点1:
          if(str.length >= 2 && str[str.length -1] == val.key &&  str[str.length -2] == val.key) {
              continue
          }
          // 注意点2:
          str += val.key
          val.value --
          break
      }
      
    这里有几个注意点:
    • 注意点1:如果要输出的字符串 长度已经是2或者大于2 且当前最后一个和前一个都是一样的字符 就跳过
    • 注意点2:将数据放入字符串中 然后中止循环 重新排序后 在进行循环;为何需要这样操作?主要是因为我们每次进行一次添加之后,剩余的字符就有产生对应的变化,所以可能导致并不是最长最多的字符串在前,也就是数组不是降序

完整代码:

function longestDiverseString(a, b, c) {
    const keysList = [{value: a, key: 'a'},{value: b, key: 'b'},{value: c, key: 'c'}]
    let hasNext = true
    let str = ''
    while(hasNext) {
        keysList.sort((a,b) => {
            return b.value - a.value
        })
        for(const val of keysList) {
            if(val.value <= 0) {
                hasNext = false
                break
            }
            // 如果要输出的字符串 长度已经是2了 且当前最后一个和前一个都是一样的字符 就跳过
            if(str.length >= 2 && str[str.length -1] == val.key &&  str[str.length -2] == val.key) {
                continue
            }
            // 将数据放入字符串中 然后中止循环 重新排序后 在进行循环
            str += val.key
            val.value --
            break
        }
    }
    return str
};

来源:力扣(LeetCode) 链接:leetcode-cn.com/problems/lo…