Minimum Window Substring

유승선 ·2022년 10월 14일
0

LeetCode

목록 보기
60/121

문제를 찾던 와중에 투포인터/슬라이딩 윈도우 문제를 발견해서 풀어보았다. 슬라이딩 윈도우 유형의 문제는 굉장히 많지만 조금 특이하고 괜찮게 봤던 문제다.

t가 속하는 모든 s의 substring 중에 가장 짧은것을 뽑아내면 된다. 그리고 이 문제를 풀기 위해서 중요한 점은 다름아닌 맵을 사용하여 투포인터의 한 부분이 t의 전부를 만들었을때 계산을 해주어야한다.

left 포인터를 옮기는 조건은 최대로 줄일 수 있을만큼이다. 즉, t의 형태를 유지하면서 불필요한 알파뱃들을 빼주는 작업이 필요하다는 뜻이다. 그런데 중복되는 aa같은게 있기때문에 무턱대고 map1 == map2 하면은 틀리게 되어서 계속 비교해야 하나 생각했는데 내 실수였다.

t의 문자가 발견되면 그대로 cnt 를 하나씩 늘려서 만약 카운트가 t의 길이와 같게되면 left 를 옮겨주는 작업을 했으면 됐었다.

class Solution {
public:
    string minWindow(string s, string t) {
        map<char,int> hashMap; 
        map<char,int> trackMap; 
        int length = INT_MAX; 
        for(char& c : t) hashMap[c]++; 
        int left = 0, right = 0, letters = 0; 
        string answer = ""; 
        while(right < s.length()){ 
            if(hashMap.count(s[right])){
                trackMap[s[right]]++; 
                if(trackMap[s[right]] <= hashMap[s[right]]){
                    letters++; 
                }
            }
            if(letters >= t.length()){
                cout << "aa" << endl; 
                while(!hashMap.count(s[left]) || trackMap[s[left]] > hashMap[s[left]]){
                    trackMap[s[left]]--;
                    left++; 
                }
                if(right - left + 1 < length){
                    length = right - left + 1;  
                    answer = s.substr(left, length); 
                }
            }
            right++; 
        }
        return answer; 
    }
};
profile
성장하는 사람

0개의 댓글