[LeetCode] 316. Remove Duplicate letters (javascript)
728x90
반응형
먼저 각 문자의 총 등장 개수를 저장한다
stack에 b, c, a 가 들어오고 또 b, c가 들어올 때 (b, c, a ,b, c 예제)
a가 들어오는 순간 stack에 이미 들어있던 b, c는 뒤에 또 등장하므로 (cnt>0) 이므로 나중에 다시 stack에 넣어주면
되므로 stack에서 없애고 a를 집어넣는다.
뒤에 다시 등장하는 b, c는 cnt==0이므로 또 뒤에 등장하는 b,c가 없어 더 이상 스택에서 제거할 수 없고
지금 사용한다고 보면 된다.
/**
* @param {string} s
* @return {string}
*/
var removeDuplicateLetters = function(s) {
const cnt={} // 각 문자가 등장하는 개수 저장하는 객체
for(let i=0;i<s.length;i+=1){
if(!cnt[s[i]]){
cnt[s[i]]=1;
}else{
cnt[s[i]]+=1;
}
}
const checked={}; // 해당 문자가 체크되었는지
const stack=[];
for(let i=0;i<s.length;i+=1){
cnt[s[i]]-=1; //한 번 등장하면 등장 가능한 갯수 줄여준다
if(checked[s[i]])continue; // 이미 stack에 있는 수라면 지나가기
while(stack && stack[stack.length-1]>s[i] && cnt[stack[stack.length-1]]>0){
//현재의 수가 이미 stack에 있는 문자보다 사전적으로 더 빠른 수이고 stack에 있는 문자가
//굳이 지금 쓰이지 않고 나중에 다시 등장할 수 있다면
checked[stack[stack.length-1]]=0; //stack체크에서 삭제해준다.
stack.pop(); //마지막 문자 삭제
}
stack.push(s[i]); //현재 문자 넣기
checked[s[i]]=1; //현재 문자는 stack에 들어있게 되었다
}
return stack.join('')
};
728x90
반응형
'Leetcode' 카테고리의 다른 글
[LeetCode] 771. Jewels and Stones (javascript) (0) | 2020.12.18 |
---|---|
[LeetCode] 739. Daily Temperatures (javascript) (0) | 2020.12.18 |
[LeetCode] 121. Best time to buy and sell stock (javascript) (0) | 2020.12.18 |
[LeetCode] 5. Longest Palindromic Substring (javascript) (0) | 2020.12.17 |
[LeetCode] 49. Group Anagrams (javascript) (0) | 2020.12.17 |
TAGS.