File tree Expand file tree Collapse file tree 4 files changed +138
-0
lines changed
longest-repeating-character-replacement Expand file tree Collapse file tree 4 files changed +138
-0
lines changed Original file line number Diff line number Diff line change 1+ #include < vector>
2+ #include < iostream>
3+
4+ using namespace std ;
5+
6+ class Node {
7+ public:
8+ int val;
9+ vector<Node*> neighbors;
10+ Node () {
11+ val = 0 ;
12+ neighbors = vector<Node*>();
13+ }
14+ Node (int _val) {
15+ val = _val;
16+ neighbors = vector<Node*>();
17+ }
18+ Node (int _val, vector<Node*> _neighbors) {
19+ val = _val;
20+ neighbors = _neighbors;
21+ }
22+ };
23+ /*
24+ std::vector<T> v;
25+
26+ v.emplace_back(arg1, arg2, ...); // 생성자 인자를 바로 전달해 컨테이너 안에서 직접 T 객체를 생성
27+ */
28+
29+ #include < unordered_map>
30+ #include < queue>
31+
32+ class Solution {
33+ public:
34+ Node* cloneGraph (Node* node) {
35+ if (!node)
36+ return (nullptr );
37+ unordered_map<Node*, Node*> m;
38+ queue<Node*> q;
39+
40+ m[node] = new Node (node->val ); // 시작 노드를 복제하고 맵과 큐에 등록
41+ q.push (node);
42+
43+ // BFS
44+ while (!q.empty ()) {
45+ Node* cur = q.front ();
46+ q.pop ();
47+
48+ for (Node* nei : cur->neighbors ) {
49+
50+ // 아직 복제하지 않은 노드일 때
51+ if (!m.count (nei)) {
52+ m[nei] = new Node (nei->val );
53+ q.push (nei);
54+ }
55+ m[cur]->neighbors .push_back (m[nei]); // 현재 복제본에 이 이웃의 복제본을 연결
56+ }
57+ }
58+ return m[node];
59+ }
60+ };
Original file line number Diff line number Diff line change 1+ #include < iostream>
2+ #include < algorithm>
3+ using namespace std ;
4+
5+ /*
6+ 시간 복잡도 : O(n)
7+ 공간 복잡도 : O(1)
8+
9+ 구간 길이 windowSize = (right - left + 1)에서,
10+ windowSize - maxCount <= k 이면 이 구간을 모두 같은 문자로 만들 수 있다
11+ windowSize - maxCount > k 이면 교체가능한 횟수가 초과되었으므로 left를 한 칸 밀어서 구간을 줄인다
12+ */
13+ class Solution {
14+ public:
15+ int characterReplacement (string s, int k) {
16+ int left = 0 ;
17+ int maxCount = 0 ;
18+ int answer = 0 ;
19+ int count[26 ] = {0 };
20+
21+ for (int right = 0 ; right < s.size (); right++) {
22+
23+ count[s[right] - ' A' ]++;
24+ maxCount = max (maxCount, count[s[right] - ' A' ]); // 윈도우 안에서 가장 많은 빈도를 갱신
25+ while (right - left + 1 - maxCount > k) {
26+ count[s[left] - ' A' ]--;
27+ left++;
28+ }
29+ answer = max (answer, right - left + 1 );
30+
31+ }
32+ return (answer);
33+ }
34+ };
Original file line number Diff line number Diff line change 1+ #include < iostream>
2+
3+ using namespace std ;
4+
5+ /*
6+ 중심 확장 방식
7+ 전체 문자열길이 n에 대해서
8+ - 홀수 길이용 n개
9+ - 짝수 길이용 n - 1개
10+ 전체 2n - 1개의 중심에서 각 양쪽으로 확장하며 카운트
11+ */
12+ class Solution {
13+ public:
14+ int countSubstrings (string s) {
15+ int answer = 0 ;
16+ int n = s.size ();
17+
18+ for (int center = 0 ; center < 2 * n - 1 ; center++) {
19+ int left = center / 2 ;
20+ int right = left + (center % 2 );
21+
22+ while (left >= 0 && right < n && s[left] == s[right]) {
23+ answer++;
24+ left--;
25+ right++;
26+ }
27+ }
28+ return (answer);
29+ }
30+ };
Original file line number Diff line number Diff line change 1+ #include < iostream>
2+
3+ class Solution {
4+ public:
5+ uint32_t reverseBits (uint32_t n) {
6+ unsigned int reverse = 0 ;
7+ for (int i = 0 ; i < 32 ; i++) {
8+ reverse <<= 1 ; // 한 비트를 왼쪽으로 당겨서 공간을 만들고
9+ reverse |= (n & 1 ); // n의 최하위 비트를 reverse의 최하위 비트에 저장
10+ n >>= 1 ; // n의 다음 비트를 최하위 비트로 당겨온다
11+ }
12+ return (reverse);
13+ }
14+ };
You can’t perform that action at this time.
0 commit comments