之前一直在Leetcode里面做完未记录,今天又想起来记录下,是因为一道题有时候用了多种方法写,在leetcode里面看不方便,既然想起来还是记录下吧。
解法一: 利用栈的思路
思路: 将s转成数组,加入栈中,如果加入的字符和栈中最后一个字符相同,则累加,直到累加超过3,则加入结果数组里,这里存在一个大于3的时候重复添加的过程,所以最近结果数组再去重。
这样写内存消耗比较大!
let stack = [], resArr = [], resArr2 = [];
let arr = s.split('');
let i = -1, num = 1;
while(arr.length > 0){
i++;
let item = arr.shift();
if(stack[stack.length - 1] && stack[stack.length - 1] === item){
num++;
if(num>=3){
resArr[1] = i;
resArr2.push(resArr);
}
}else{
num = 1;
resArr = []
resArr[0] = i;
stack.push(item);
}
}
return [...new Set(resArr2)];
解法二: 双指针法
思路:定义前后指针都为0,当前一个元素和后一个相同的时候,让后指针先走,直到出现元素和前一个元素不同的时候,统计后指针是否比前指针多走了2步,如果是,则将前后指针步数加入结果数组。同时在不同的时候将前后指针的步数与当前位置i保持统一。
let start = end = 0;
let res = [];
for(let i=0;i<s.length;i++){
if(s[i] === s[i+1]){
end++
}else{
if(end - start >=2){
res.push([start, end]);
}
start = end = i+1;
}
}
return res;