|
| 1 | +/** |
| 2 | + * sliding window |
| 3 | + * λ¬Έμμ΄ kλ² λ³κ²½ κ°λ₯ν, κ°μ₯ κΈ΄ λ°λ³΅ λ¬Έμμ΄μ κΈΈμ΄ κ΅¬νκΈ°. |
| 4 | + * @param {string} s - λ¬Έμμ΄ |
| 5 | + * @param {number} k - λ¬Έμ λ³κ²½ κ°λ₯ νμ |
| 6 | + * @return {number} - κ°μ₯ κΈ΄ λΆλΆ λ¬Έμμ΄μ κΈΈμ΄ |
| 7 | + * |
| 8 | + * μκ° λ³΅μ λ: O(n) |
| 9 | + * - λ¬ΈμκΈΈμ΄ λ§νΌμ 1ν μν |
| 10 | + * |
| 11 | + * κ³΅κ° λ³΅μ‘λ: O(1) |
| 12 | + * - μνλ²³ 26κ°μ μ νλ Map μ¬μ© |
| 13 | + * |
| 14 | + */ |
| 15 | +function characterReplacement(s: string, k: number): number { |
| 16 | + // λ¬Έμμ λΉλλ₯Ό μ μ₯ν Map |
| 17 | + const charFreq = new Map<string, number>(); |
| 18 | + |
| 19 | + // window μΌμͺ½ ν¬μΈν° |
| 20 | + let left = 0; |
| 21 | + |
| 22 | + // μ΅λ κΈΈμ΄, μ΅λ λΉλ μ΄κΈ°ν |
| 23 | + let maxLength = 0; |
| 24 | + let maxFreq = 0; |
| 25 | + |
| 26 | + // μ€λ₯Έμͺ½ ν¬μΈν°λ₯Ό 0λΆν° μ΄λνλ©° window ν¬κΈ° μ‘°μ |
| 27 | + for (let right = 0; right < s.length; right++) { |
| 28 | + const char = s[right]; |
| 29 | + |
| 30 | + // νμ¬ λ¬Έμμ λΉλ μ¦κ° |
| 31 | + charFreq.set(char, (charFreq.get(char) || 0) + 1); |
| 32 | + |
| 33 | + // μλμ° λ΄μμ κ°μ₯ λ§μ΄ λ±μ₯ν λ¬Έμμ λΉλ κ°±μ |
| 34 | + maxFreq = Math.max(maxFreq, charFreq.get(char)!); |
| 35 | + |
| 36 | + // 쑰건: (μλμ° ν¬κΈ° - maxFreq > k)μΌ λ, μΌμͺ½ ν¬μΈν° μ΄λ |
| 37 | + if (right - left + 1 - maxFreq > k) { |
| 38 | + const leftChar = s[left]; |
| 39 | + charFreq.set(leftChar, charFreq.get(leftChar)! - 1); // μΌμͺ½ λ¬Έμ μ κ±° |
| 40 | + left++; // μλμ° μΆμ |
| 41 | + } |
| 42 | + |
| 43 | + // νμ¬ μλμ° ν¬κΈ°λ₯Ό κΈ°μ€μΌλ‘ μ΅λ κΈΈμ΄ κ°±μ |
| 44 | + maxLength = Math.max(maxLength, right - left + 1); |
| 45 | + } |
| 46 | + |
| 47 | + return maxLength; |
| 48 | + |
| 49 | +} |
| 50 | + |
0 commit comments