(Leetcode) [String] Longest repeating character replacement
Topic: String
Difficulty: Medium
Question
Given a string s
and an integer k
, you can choose any character of the string and change it to any other uppercase English character at most k times.
Return the length of the longest substring containing the same lteer you can get after perfoming the above operations.
์ฃผ์ด์ง ๋ฌธ์์ด์์, ์ํ๋ฒณ k๊ฐ๋ฅผ ์ ์ผ ๊ธด ๋ถ๋ถ ๋ฌธ์์ด์ด ๋์ค๊ฒ๋ ๋ฐ๊ฟ์ ๊ทธ์ ๊ธธ์ด๋ฅผ ๋ฆฌํดํด๋ผ.
Solution: Window slicing method
์ ํ ๊ฐ์ด ์ค์ง ์์์ geeksforgeeks์ ์ ํ๋ธ๋ฅผ ์ฐพ์๋ณด์๋ค.
Window sliding method๋ฅผ ์ฌ์ฉํ๋ค.
arr ๋ฐฐ์ด์ window ์์ ์๋ ํน์ ๊ธ์์ ๊ฐฏ์๋ฅผ ๋ํ๋ด๊ธฐ ์ํจ์ด๋ค. ๊ทธ๋์ ๋ฐฐ์ด์ ํฌ๊ธฐ๋ ์ํ๋ฒณ์ ์ด ๊ฐ์ (26๊ฐ)์ด๋ค.
window์ ์ค๋ฅธ์ชฝ index๋ฅผ for loop์ ์ด์ฉํด ๋๋ ค์ฃผ๋ ๋ฐฉ์์ผ๋ก ๊ตฌํํ๋ค.
์ฐฝ๋ฌธ ์์ ์๋ ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ณต๋๋ ์ํ๋ฒณ์ผ๋ก ๋๋จธ์ง ๋ค๋ฅธ ์ํ๋ฒณ์ ๋ฐ๊ฟ์ฃผ๋๊ฒ ๊ฐ์ฅ ํจ์จ์ ์ผ๋ก longest repeating substring์ ๊ฐ์ง ์ ์๋ ๋ฐฉ๋ฒ์ด๋ค.
๊ทธ๋์ int newlyAddedCharNum
์ ์๋ก์ด ๋ฐ๋์ด์ผ ํ๋ ์ํ๋ฒณ์ ๊ฐฏ์๋ฅผ ์ ์ฅํ๋ค.
newlyAddedCharNum (๋ฐ๋์ด์ผ ํ๋ ์ํ๋ฒณ์ ๊ฐฏ์)๊ฐ k๋ณด๋ค ํฌ๋ฉด, ์ผ์ชฝ index๋ฅผ ํ ์นธ ์ฎ๊ธด๋ค. ๊ทธ๋ฌ๋ฉด์ ์ฐฝ๋ฌธ ๋ฐ์ผ๋ก ๋๊ฐ ๋จ์ด์ง ์ํ๋ฒณ์ ๊ฐ์๋ฅผ ํ๋ ์ค์ธ๋ค.
int characterReplacement(string s, int k) {
int result = 0;
int leftInd = 0;
int arr[26] = { };
int windowSize;
for (int j=0; j<s.length(); j++) {
// as window enlarges, increment the number of newly added character
arr[s[j]-'A']++;
// saves the number of characters that needs to be changed to obtain the longest repeating substring
int newlyAddedCharNum = j-leftInd+1 - *max_element(arr, arr+26);
if (newlyAddedCharNum > k) {
arr[s[leftInd]-'A']--;
leftInd++;
}
result = max(result, j-leftInd+1);
}
return result;
}
Summary
์ ๋ฒ์๋ window sliding ๋ฐฉ๋ฒ์ ์ผ์๋๋ฐ ์ธ์ ์์ง.
Leave a comment