之前一直在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;