题目如下


找到给定字符串(由小写字符组成)中的最长子串 T , 要求 T 中的每一字符出现次数都不少于 k 。输出 T 的长度。

示例 1:

输入:
s = "aaabb", k = 3

输出:
3

最长子串为 "aaa" ,其中 'a' 重复了 3 次。
示例 2:

输入:
s = "ababbc", k = 2

输出:
5

最长子串为 "ababb" ,其中 'a' 重复了 2 次, 'b' 重复了 3 次。

解答,第一眼看到这个题目,首先需要找到每一个字符出现的频率,在根据频率符合大于K进行汇总
第一遍的答案

var longestSubstring = function(s, k) {
    let arr = s.split('')
    let obj = {}
    arr.forEach(item => {
      if (obj[item]) {
        obj[item] = obj[item] +1
      } else {
        obj[item] = 1
      }
    })
    let number = 0
    for (const i in obj) {
      if (obj[i] >= k) {
        number += obj[i]
      }
    }
    return number
};
console.log(longestSubstring('aaabb', 3))  ==>3
console.log(longestSubstring('ababbc', 2)) ==>5

答案是正确的,首先字符串分割,进行遍历,按字符:频率的形式存到对象里,在对对象进行遍历取值,然后在来优化一下,缩减一下代码,用三目运算符来代替if else

var longestSubstring = function(s, k) {
  let obj = {}
  let number = 0
  s.split('').forEach(item => {
      obj[item] ? (obj[item] = obj[item] +1 ):  (obj[item] = 1)
  })
  for (const i in obj) {
      obj[i] >= k && (number += obj[i])
  }
  return number
};
console.log(longestSubstring('aaabb', 3)) ==>3
console.log(longestSubstring('ababbc', 2))

简化了几行,性能上没有太大的变化,看起来舒服一点吧。
总感觉一遍循环就可以完成这个事情,我这里循环了两遍


题目来自于leetcode
vscode leetcode插件地址https://github.com/jdneo/vsco...
上班刷题不是梦


hayho
0 声望0 粉丝