「这是我参与2022首次更文挑战的第14天,活动详情查看:2022首次更文挑战」
最长快乐字符串
如果字符串中不含有任何 'aaa','bbb' 或 'ccc' 这样的字符串作为子串,那么该字符串就是一个「快乐字符串」。
给你三个整数 a,b ,c,请你返回 任意一个 满足下列全部条件的字符串 s:
- s 是一个尽可能长的快乐字符串。
- s 中 最多 有a 个字母 'a'、b 个字母 'b'、c 个字母 'c' 。
- s 中只含有 'a'、'b' 、'c' 三种字母。 如果不存在这样的字符串 s ,请返回一个空字符串 ""。
解题思路
- 根据题意 我们最终输出的字符串只能是
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…