写字符串需要的行数

125 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第1天,点击查看活动详情

题目描述

在一个由小写字母构成的字符串 s 中,包含由一些连续的相同字符所构成的分组。 例如,在字符串 s = "abbxxxxzyy" 中,就含有 "a", "bb", "xxxx", "z" 和 "yy" 这样的一些分组。 分组可以用区间 [start, end] 表示,其中 start 和 end 分别表示该分组的起始和终止位置的下标。上例中的 "xxxx" 分组用区间表示为 [3,6] 。 我们称所有包含大于或等于三个连续字符的分组为 较大分组 。 找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。(出自力扣)

  • 示例1:
输入: s = "abbxxxxzzy"
输出: [[3,6]]
解释 : "xxxx" 是一个起始于 3 且终止于 6 的较大分组。
  • 示例2:
输入: s = "abc"
输出: []
解释: "a","b""c" 均不是符合要求的较大分组。
  • 示例3:
输入:s = "abcdddeeeeaabbbcd"
输出:[[3,5],[6,9],[12,14]]
解释:较大分组为 "ddd", "eeee""bbb"

思路分析

需声明三个变量保存我们想要的东西,第一个是当前连续的字母letter,第二个是字母连续出现的次数frequency,第三个是当前字母的起始位置start;首先,遍历整个字符串,用遍历到的字母和当前字母做对比,看是否相同,若是相同则frequency加1,若是不相同,就再判断下当前字母出现的频率是否大于等于3,若满足当前要求则将[start, i-1]放到结果数组final里面;初始化letter、frequency、start三个变量。

AC代码

let strs = 'wwssssdddksgggg'
function getLocation(str) {
  let letter = str[0], frequency = 1, start = 0, final = [];
  for(let i = 0; i<=str.length; i++) {
    if (str[i] === letter) {
      frequency++
    } else {
      if (frequency >= 3) {
        final.push([start, i - 1])
      }
      start = i
      letter = str[i]
      frequency = 1
    }
  }
  console.log(final)
}
getLocation(strs)

总结

这道题目主要是考察字符串的运用,这里遍历字符串取其下标,然后生成我们想要的数组。