File tree 2 files changed +65
-0
lines changed
longest-repeating-character-replacement 2 files changed +65
-0
lines changed Original file line number Diff line number Diff line change
1
+ /*
2
+ s는 영어 대문자만 포함 : 26의 크기를 가진 vector counts에 빈도 저장
3
+
4
+ left, right 통해 슬라이딩 윈도우 기법 적용
5
+
6
+ 1. right 위치의 문자 빈도 수를 증가시키고 maxCnt를 업데이트한다
7
+ - maxCnt는 현재까지 윈도우를 움직이면서 윈도우 내에 한가지 문자의 최대 빈도수
8
+
9
+ 2. (윈도우의 크기 - maxCnt) > k일 때 최대 대체 가능한 문자의 수를 넘어섰으므로 윈도우의 크기를 줄임
10
+ : s[left]의 빈도 감소 및 left를 전진
11
+
12
+ 3. ans는 max(현재 윈도우의 크기, 기존 최대 크기 ans) 로 업데이트
13
+
14
+
15
+ - ans의 증가는 maxCnt가 증가 | 최대빈도문자와 다른 문자가 k개 이하일 때 -> (maxCnt ~ maxCnt + k)로 업데이트
16
+ 이 때는 while 루프를 수행하지 않음
17
+
18
+ - while (right - left + 1 - maxCnt > k) -> 실제 이 조건을 만족하는 윈도우에서는 대체해야할 문자가 k보다 많이 존재할 수도 있다
19
+ 다만 윈도우의 크기를 maxCnt + k개로 제한하기 때문에 실제 답보다 더 크게 업데이트 될 수 없다
20
+ 매번 윈도우 내의 최대빈도문자를 계산하지 않아도 되기 때문에 살짝 최적화 O(26n) -> O(n)
21
+
22
+ s의 길이 : N
23
+
24
+ TC : O(N)
25
+
26
+ SC : O(1)
27
+ 상수(26) 크기의 배열
28
+ */
29
+
30
+ #include < string>
31
+ #include < vector>
32
+ using namespace std ;
33
+
34
+ class Solution {
35
+ public:
36
+ int characterReplacement (string s, int k) {
37
+ vector<int > counts (26 , 0 );
38
+ int left = 0 , right = 0 , maxCnt = 0 , ans = 0 ;
39
+
40
+ for (; right < s.size (); right++) {
41
+ maxCnt = max (maxCnt, ++counts[s[right] - ' A' ]);
42
+
43
+ while (right - left + 1 - maxCnt > k) {
44
+ --counts[s[left] - ' A' ];
45
+ left++;
46
+ }
47
+ ans = max (ans, right - left + 1 );
48
+ }
49
+ return ans;
50
+ }
51
+ };
Original file line number Diff line number Diff line change
1
+ /*
2
+ 풀이 :
3
+ n & 1 -> n의 오른쪽 첫번째 비트 -> ans에 더한다
4
+ n >> 1 & 1 -> n의 오른쪽 두번째 비트 -> ans를 << 1 해준뒤 더한다
5
+ ...
6
+
7
+ n의 오른쪽 끝자리부터 ans에 더해져서 << 연산에 의해 좌측으로 가기 때문에 비트를 뒤집을 수 있다
8
+
9
+ TC : O(1)
10
+ 32번
11
+
12
+ SC : O(1)
13
+ s*/
14
+
1
15
#include < stdint.h>
2
16
3
17
class Solution {
You can’t perform that action at this time.
0 commit comments