반응형
class Solution {
public String minWindow(String s, String t) {
HashMap <Character, Integer> hashMap = new HashMap<>();
HashMap <Character, Integer> hashMap2 = new HashMap<>();
String result = "";
for(char c : t.toCharArray()) {
hashMap.put(c, hashMap.getOrDefault(c, 0)+1);
}
int left = 0;
int right = 0;
// t에 문자가 얼마나 포함되어 있는지 카운트 해주는 변수
int count = 0;
for(right=0; right<s.length(); right++) { // 우측은 계속 확장
char c = s.charAt(right);
// 우측 문자 저장
hashMap2.put(c, hashMap2.getOrDefault(c, 0)+1);
// 그 문자가 t에 완전히 다 포함되어 있다면 count ++
if(hashMap.getOrDefault(c, 0).intValue() == hashMap2.getOrDefault(c, 0).intValue()) {
count ++;
}
// 확장한 문자열이 모두 t에 들어가 있다면
while(count == hashMap.size()) {
// 결과 refresh
if(result.equals("") || result.length() > s.substring(left, right+1).length()) {
result = s.substring(left, right+1);
}
c = s.charAt(left);
// 좌측 커서 우측으로 이동
hashMap2.put(c, hashMap2.get(c)-1);
if(hashMap.getOrDefault(c, 0).intValue() > hashMap2.getOrDefault(c, 0).intValue()) {
count --;
}
left ++;
}
}
return result;
}
}
시간 복잡도.
T hashMap 초기화 O(T)
S 좌측, 우측 한번씩 이동 각각 O(S)
따라서 O(2S + T) // 최악의 경우
--> O(S+T) -> O(n) 이라고 볼 수 있다.
알고리즘 과정.
s = "ADOBECODEBANC", t = "ABC"
다음 예시를 보면
left right 는 각각 초기 값 0으로 초기화 후 right 는 우측으로 확장한다.
그럼 A D O B E C 까지 확장하게 되고, 이는 A B C 에 속하기 때문에 결과값을 refresh 한다.
여기서 left 도 우측으로 확장한다.(t에포함되는한 계속)
그럼 여기서 D O B E C 까지 되고 이는 t에 속하지 않기 때문에. left 는 한칸 우측으로 이동하고 끝난다.
다음 우측 확장시,
D O B E C O D E B A 까지 다시 확장된다. 이는 A B C 에 속하지만 최소 문자열이 아니라 값 갱신 하지 않는다.
그 후 left 우측 확장
E C O D E B A 까지 확장한다.
다음 우측 확장
E C O D E B A N C
좌측 확장
B A N C
이값은 최소열 이기 때문에 갱신되고 끝나게 된다.
반응형
'Algorithm' 카테고리의 다른 글
leetcode 리트코드 912 머지소트 (0) | 2025.02.28 |
---|---|
leetcode 164 java (0) | 2025.02.25 |
leetcode 14 java (2) | 2025.02.18 |
leetcode 125 java (0) | 2025.02.17 |
leetcode 344 java (0) | 2025.02.17 |