题目
在一个由小写字母构成的字符串 s
中,包含由一些连续的相同字符所构成的分组。
例如,在字符串 s = "abbxxxxzyy"
中,就含有 "a"
, "bb"
, "xxxx"
, "z"
和 "yy"
这样的一些分组。
分组可以用区间 [start, end]
表示,其中 start
和 end
分别表示该分组的起始和终止位置的下标。上例中的 "xxxx"
分组用区间表示为 [3,6]
。
我们称所有包含大于或等于三个连续字符的分组为 较大分组。
找到每一个 较大分组 的区间,按起始位置下标递增顺序排序后,返回结果。
题解
先写一个能用的
执行用时:96 ms, 在所有 JavaScript 提交中击败了 82.86% 的用户
/**
* @param {string} s
* @return {number[][]}
*/
var largeGroupPositions = function (s) {
let arr = [];
let temp = [];
debugger;
for (let index = 0; index < s.length; index++) {
const element = s[index];
if (temp[0] == undefined) {
temp[0] = {
index,
element,
};
} else {
if (temp[0].element == element) {
temp[1] = {
index,
element,
};
if (temp[1] && temp[1].index && temp[1].index - temp[0].index >= 2) {
if (arr[arr.length - 1] && arr[arr.length - 1][0] == temp[0].index) {
arr[arr.length - 1] = [temp[0].index, temp[1].index];
} else {
arr[arr.length] = [temp[0].index, temp[1].index];
}
}
} else {
console.log(temp);
temp[0] = {
index,
element,
};
}
}
}
return arr;
};
console.log('object', largeGroupPositions('aaa'));
// largeGroupPositions("abcdddeeeeaabbbcd")
代码优化一下,官方题解
var largeGroupPositions = function (s) {
const ret = [];
const n = s.length;
let num = 1;
for (let i = 0; i < n; i++) {
if (i === n - 1 || s[i] !== s[i + 1]) {
if (num >= 3) {
ret.push([i - num + 1, i]);
}
num = 1;
} else {
num++;
}
}
return ret;
};
恐怖如斯的正则
var largeGroupPositions = function (s) {
return Array.from(s.matchAll(/(.)\1\1+/g), (v) => [
v.index,
v.index + v[0].length - 1,
]);
};
var largeGroupPositions = function(s) {
const r = []
s.replace(/(.)\1{2,}/g, (a, _, i)=> r.push([i, i + a.length - 1]))
return r
};
更快的扫描
var largeGroupPositions = function (s) {
let i = 0,
start = 0,
r = [];
while (++i <= s.length)
if (s[start] !== s[i]) {
if (i - start > 2) r.push([start, i - 1]);
start = i;
}
return r;
};
栈方法,恐怖如斯,应该是目前最快的
class Stack {
constructor() {
this.q = [];
}
length() {
return this.q.length;
}
top() {
return this.q[this.length() - 1];
}
clear() {
this.q.length = 0;
}
push(v) {
let len = 0;
if (v !== this.top()) {
len = this.length();
this.clear();
}
this.q.push(v);
return len;
}
}
var largeGroupPositions = function (s) {
let i = -1,
q = new Stack(),
r = [];
while (++i <= s.length) {
const n = q.push(s[i]);
if (n > 2) r.push([i - n, i - 1]);
}
return r;
};