之前一直在Leetcode里面做完未記錄,今天又想起來記錄下,是因為一道題有時候用了多種方法寫,在leetcode里面看不方便,既然想起來還是記錄下吧。

image.png
解法一: 利用棧的思路
思路: 將s轉(zhuǎn)成數(shù)組,加入棧中,如果加入的字符和棧中最后一個字符相同,則累加,直到累加超過3,則加入結(jié)果數(shù)組里,這里存在一個大于3的時候重復(fù)添加的過程,所以最近結(jié)果數(shù)組再去重。
這樣寫內(nèi)存消耗比較大!
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,當(dāng)前一個元素和后一個相同的時候,讓后指針先走,直到出現(xiàn)元素和前一個元素不同的時候,統(tǒng)計后指針是否比前指針多走了2步,如果是,則將前后指針步數(shù)加入結(jié)果數(shù)組。同時在不同的時候?qū)⑶昂笾羔樀牟綌?shù)與當(dāng)前位置i保持統(tǒng)一。
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;