一起养成写作习惯!这是我参与「掘金日新计划 · 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)
总结
这道题目主要是考察字符串的运用,这里遍历字符串取其下标,然后生成我们想要的数组。