Skip to content

Commit cb416e3

Browse files
committed
solution
1 parent 73c3f0d commit cb416e3

File tree

2 files changed

+80
-0
lines changed

2 files changed

+80
-0
lines changed
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
/**
2+
* @param {string} s
3+
* @param {number} k
4+
* @return {number}
5+
*/
6+
var characterReplacement = function(s, k) {
7+
let left = 0;
8+
let maxCount = 0;
9+
const freq = new Array(26).fill(0); // 알파벳 빈도수 저장
10+
11+
let result = 0;
12+
13+
for (let right = 0; right < s.length; right++) {
14+
const idx = s.charCodeAt(right) - 65; // A ~ Z -> 0 ~ 25
15+
freq[idx]++;
16+
maxCount = Math.max(maxCount, freq[idx]);
17+
18+
// 현재 윈도우 크기 - 가장 많은 문자 수 > k 면 왼쪽 포인터 이동
19+
while ((right - left + 1) - maxCount > k) {
20+
freq[s.charCodeAt(left) - 65]--;
21+
left++;
22+
}
23+
24+
result = Math.max(result, right - left + 1);
25+
}
26+
27+
return result;
28+
};
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
/**
2+
* @param {string} s
3+
* @param {string} t
4+
* @return {string}
5+
*/
6+
var minWindow = function(s, t) {
7+
if (s.length < t.length) return "";
8+
9+
// 1. t의 문자 개수를 세기
10+
const targetMap = new Map();
11+
for (let char of t) {
12+
targetMap.set(char, (targetMap.get(char) || 0) + 1);
13+
}
14+
15+
let left = 0;
16+
let right = 0;
17+
let minLen = Infinity;
18+
let minStart = 0;
19+
20+
let required = targetMap.size; // 만족시켜야 할 문자 종류 수
21+
let formed = 0;
22+
const windowMap = new Map();
23+
24+
while (right < s.length) {
25+
const char = s[right];
26+
windowMap.set(char, (windowMap.get(char) || 0) + 1);
27+
28+
// 문자 개수가 딱 맞는 경우
29+
if (targetMap.has(char) && windowMap.get(char) === targetMap.get(char)) {
30+
formed++;
31+
}
32+
33+
// 모든 문자가 충족될 경우 -> 왼쪽 포인터 당겨보기
34+
while (left <= right && formed === required) {
35+
if (right - left + 1 < minLen) {
36+
minLen = right - left + 1;
37+
minStart = left;
38+
}
39+
40+
const leftChar = s[left];
41+
windowMap.set(leftChar, windowMap.get(leftChar) - 1);
42+
if (targetMap.has(leftChar) && windowMap.get(leftChar) < targetMap.get(leftChar)) {
43+
formed--;
44+
}
45+
left++;
46+
}
47+
48+
right++;
49+
}
50+
51+
return minLen === Infinity ? "" : s.slice(minStart, minStart + minLen);
52+
};

0 commit comments

Comments
 (0)