js找到给定字符串中的最长子串-T-T-中的每一字符出现次数都不少于-k-输出-T-的长度

33次阅读

共计 976 个字符,预计需要花费 3 分钟才能阅读完成。

题目如下


找到给定字符串(由小写字符组成)中的最长子串 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…
上班刷题不是梦

正文完
 0