|
| 1 | +/** |
| 2 | + * ํ์ด |
| 3 | + * - ์ฃผ์ด์ง s๋ก ๋ง๋ค ์ ์๋ ๊ฐ์ฅ ๊ธด valid substring์ ๊ธธ์ด๋ฅผ ์ฐพ๋ ๋ฌธ์ ์
๋๋ค |
| 4 | + * - valid substring: ์ต๋ k๊ฐ์ ๋ฌธ์๋ฅผ ๋ฐ๊ฟ์, ๋ชจ๋ ๋ฌธ์๊ฐ ๊ฐ๊ฒ ๋ง๋ค ์ ์๋ substring |
| 5 | + * |
| 6 | + * - ๋ ๋จ๊ณ๋ก ๋๋์ด ํ์ด์ ๋ํด ์๊ฐํ ์ ์์ต๋๋ค |
| 7 | + * |
| 8 | + * - 1. ํน์ ๊ธธ์ด์ valid substring์ ๋ง๋ค ์ ์๋์ง ํ์ธ |
| 9 | + * - ํจ์ bool can_make_valid_substring(string const s, int substr_length, int k) |
| 10 | + * - ํน์ ๊ธธ์ด์ substring์ ๋ํด์, ๋ฑ์ฅ ๋น๋๊ฐ ๊ฐ์ฅ ๋์ ๋ฌธ์์ ๋น๋์๋ฅผ ์ ์ฅํฉ๋๋ค (max_freq) |
| 11 | + * ๋ง์ฝ ํด๋น substring์ด valid substring์ด๋ผ๋ฉด, max_freq + k >= substr_length ์ด์ด์ผ ํฉ๋๋ค |
| 12 | + * |
| 13 | + * - 2. ์ต๋ ๊ธธ์ด์ valid substring์ ์ฐพ๋๋ค |
| 14 | + * - ์ด์งํ์์ ํตํด ์ต๋ ๊ธธ์ด๋ฅผ ์ฐพ๋๋ค |
| 15 | + * - ํจ์ int characterReplacement(string s, int k) |
| 16 | + * - ์ฃผ์ด์ง ๋ฌธ์์ด s๋ก ๋ง๋ค ์ ์๋ substring์ ๊ธธ์ด๋ 1์ด์ s.size() ์ดํ์
๋๋ค |
| 17 | + * ์ด์ง ํ์์ ๋ฒ์๋ฅผ ์์์ ์ธ๊ธํ ๋๋ก ์ค์ ํ๊ณ , ํ์ฌ ํ์ํ๋ ค๋ ๊ธธ์ด (mid)์ ๋ํด์ |
| 18 | + * can_make_valid_substring ํจ์๋ฅผ ํธ์ถํ์ฌ ํ์ฌ ๊ธธ์ด๋ก valid substring์ ๋ง๋ค ์ ์๋์ง ํ์ธํฉ๋๋ค |
| 19 | + * ์ด์ง ํ์ ์๊ณ ๋ฆฌ์ฆ์ ์ ๊ฐ ๋ฐ ๊ฒฐ๊ณผ์ ๋ํ ์ค๋ช
์ https://github.com/DaleStudy/leetcode-study/discussions/332๋ฅผ ์ฐธ๊ณ ํด์ฃผ์ธ์ :) |
| 20 | + * |
| 21 | + * Big O |
| 22 | + * - N: ์ฃผ์ด์ง ๋ฌธ์์ด s์ ๊ธธ์ด |
| 23 | + * - K: ์ฃผ์ด์ง ์ ์ k |
| 24 | + * |
| 25 | + * - Time complexity: O(N * logN) |
| 26 | + * - Space complexity: O(1) |
| 27 | + */ |
| 28 | + |
| 29 | +class Solution { |
| 30 | +public: |
| 31 | + bool can_make_valid_substring(string const s, int substr_length, int k) { |
| 32 | + // ๋ฌธ์์ ๋น๋์๋ฅผ ์ ์ฅํ๋ ๋ฐฐ์ด์
๋๋ค |
| 33 | + array<int, 26> freq; |
| 34 | + freq.fill(0); |
| 35 | + |
| 36 | + // ์ต๋ ๋น๋์๋ฅผ ์ ์ฅํ๋ ๋ณ์์
๋๋ค |
| 37 | + int max_freq = 0; |
| 38 | + |
| 39 | + int window_start = 0; |
| 40 | + |
| 41 | + for (int window_end = 0; window_end < s.size(); ++window_end) { |
| 42 | + ++freq[s[window_end] - 'A']; |
| 43 | + |
| 44 | + int curr_size = window_end - window_start + 1; |
| 45 | + if (curr_size > substr_length) { |
| 46 | + --freq[s[window_start] - 'A']; |
| 47 | + ++window_start; |
| 48 | + } |
| 49 | + |
| 50 | + max_freq = max(max_freq, freq[s[window_end] - 'A']); |
| 51 | + if (max_freq + k >= substr_length) return true; |
| 52 | + } |
| 53 | + |
| 54 | + return false; |
| 55 | + } |
| 56 | + |
| 57 | + int characterReplacement(string s, int k) { |
| 58 | + int lo = 1; |
| 59 | + int hi = s.size() + 1; |
| 60 | + while (lo < hi) { |
| 61 | + int mid = lo + (hi - lo) / 2; |
| 62 | + |
| 63 | + if (can_make_valid_substring(s, mid, k)) lo = mid + 1; |
| 64 | + else hi = mid; |
| 65 | + } |
| 66 | + |
| 67 | + // ์ด์งํ์์ด ์ข
๋ฃ๋๋ฉด lo๋ ์ต๋ ๊ธธ์ด๋ณด๋ค 1 ํฐ ๊ฐ์ด ๋๋ค. |
| 68 | + // EX: hi lo |
| 69 | + // T T T T F F F F |
| 70 | + // ๋ฐ๋ผ์ ์ต๋ ๊ธธ์ด๋ lo - 1์ด ๋๋ค |
| 71 | + return lo - 1; |
| 72 | + } |
| 73 | +}; |
0 commit comments