之前一直在Leetcode里面做完未記錄舞肆,今天又想起來(lái)記錄下,是因?yàn)橐坏李}有時(shí)候用了多種方法寫葛账,在leetcode里面看不方便,既然想起來(lái)還是記錄下吧皮仁。
解法一: 利用棧的思路
思路: 將s轉(zhuǎn)成數(shù)組籍琳,加入棧中,如果加入的字符和棧中最后一個(gè)字符相同贷祈,則累加趋急,直到累加超過(guò)3,則加入結(jié)果數(shù)組里势誊,這里存在一個(gè)大于3的時(shí)候重復(fù)添加的過(guò)程呜达,所以最近結(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)];
解法二: 雙指針?lè)?br> 思路:定義前后指針都為0查近,當(dāng)前一個(gè)元素和后一個(gè)相同的時(shí)候,讓后指針先走勋颖,直到出現(xiàn)元素和前一個(gè)元素不同的時(shí)候嗦嗡,統(tǒng)計(jì)后指針是否比前指針多走了2步,如果是饭玲,則將前后指針步數(shù)加入結(jié)果數(shù)組侥祭。同時(shí)在不同的時(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;