File tree Expand file tree Collapse file tree 5 files changed +183
-0
lines changed
longest-common-subsequence
longest-repeating-character-replacement Expand file tree Collapse file tree 5 files changed +183
-0
lines changed Original file line number Diff line number Diff line change 1+ /*
2+ // Definition for a Node.
3+ class Node {
4+ public int val;
5+ public List<Node> neighbors;
6+ public Node() {
7+ val = 0;
8+ neighbors = new ArrayList<Node>();
9+ }
10+ public Node(int _val) {
11+ val = _val;
12+ neighbors = new ArrayList<Node>();
13+ }
14+ public Node(int _val, ArrayList<Node> _neighbors) {
15+ val = _val;
16+ neighbors = _neighbors;
17+ }
18+ }
19+ */
20+
21+ import java .util .HashMap ;
22+ import java .util .Map ;
23+
24+ /**
25+ * 참조 노드는 무방향 그래프에 연결되어있다. 그래프의 deep copy(clone)을 반환하세요.
26+ */
27+ class Solution {
28+
29+ // 방문한 노드를 기억할 Map 선언
30+ Map <Node , Node > visited = new HashMap <>();
31+
32+ public Node cloneGraph (Node node ) {
33+ return clone (node );
34+ }
35+
36+ public Node clone (Node node ) {
37+ if (node == null ) {
38+ return null ;
39+ }
40+
41+ // 이미 방문했으면 Map에서 꺼내서 반환
42+ if (visited .containsKey (node )) {
43+ return visited .get (node );
44+ }
45+
46+ // 신규 Node 생성
47+ Node newNode = new Node (node .val );
48+ visited .put (node , newNode );
49+
50+ // 인접 노드 Clone
51+ if (node .neighbors != null && !node .neighbors .isEmpty ()) {
52+ for (Node neighbor : node .neighbors ) {
53+ newNode .neighbors .add (clone (neighbor ));
54+ }
55+ }
56+ return newNode ;
57+ }
58+ }
59+
Original file line number Diff line number Diff line change 1+ /**
2+ * 두 문자열 text1과 text2가 주어질 때 가장 긴 공통 부분 수열의 길이를 리턴하고 없으면 0을 리턴하세요.
3+ */
4+ class Solution {
5+
6+ // 시간복잡도: O(t1Length * t2Length)
7+ public int longestCommonSubsequence (String text1 , String text2 ) {
8+
9+ int t1Length = text1 .length ();
10+ int t2Length = text2 .length ();
11+
12+ int [][]dp = new int [t1Length + 1 ][t2Length + 1 ];
13+
14+ for (int i = 1 ; i <= t1Length ; i ++) {
15+ for (int j = 1 ; j <= t2Length ; j ++) {
16+ if (text1 .charAt (i - 1 ) == text2 .charAt (j - 1 )) {
17+ dp [i ][j ] = dp [i - 1 ][j - 1 ] + 1 ;
18+ } else {
19+ dp [i ][j ] = Math .max (dp [i - 1 ][j ], dp [i ][j - 1 ]);
20+ }
21+ }
22+ }
23+ return dp [t1Length ][t2Length ];
24+
25+ }
26+ }
27+
Original file line number Diff line number Diff line change 1+ /**
2+ * 문자열 s와 정수 k가 주어진다.
3+ * 문자열 내 아무 문자나 대문자 영문자로 변경할 수 있으며 해당 연산을 k번까지 할 수 있을 때,
4+ * 같은 문자를 포함하는 가장 긴 부분 수열을 반환하세요.
5+ */
6+ class Solution {
7+
8+ // 시간복잡도: O(n)
9+ public int characterReplacement (String s , int k ) {
10+
11+ int [] chars = new int [26 ];
12+ int left = 0 ;
13+ int maxLength = 0 ;
14+ int maxCnt = 0 ;
15+
16+ for (int right = 0 ; right < s .length (); right ++) {
17+ int charIdx = s .charAt (right ) - 'A' ;
18+ chars [charIdx ]++;
19+ // 현재 윈도우 내에서 가장 많이 등장하는 문자의 개수
20+ maxCnt = Math .max (chars [charIdx ], maxCnt );
21+
22+ // window size - max cnt > k (window 사이즈 조정)
23+ while (right - left + 1 - maxCnt > k ) {
24+ chars [s .charAt (left ) - 'A' ]--;
25+ left ++;
26+ }
27+
28+ maxLength = Math .max (maxLength , right - left + 1 );
29+ }
30+
31+ return maxLength ;
32+
33+ }
34+ }
35+
Original file line number Diff line number Diff line change 1+ /**
2+ * palindrome 부분 수열의 개수를 찾으세요.
3+ */
4+ class Solution {
5+
6+ /** 시간복잡도: O(n^2), O(1) */
7+ public int countSubstrings (String s ) {
8+
9+ int count = 0 ;
10+
11+ for (int i = 0 ; i < s .length (); i ++) {
12+ count += checkPalindrome (s , i , i ); // 홀수
13+ count += checkPalindrome (s , i , i + 1 ); // 짝수
14+ }
15+
16+ return count ;
17+ }
18+
19+ private int checkPalindrome (String s , int left , int right ) {
20+ int count = 0 ;
21+ while (left >= 0 && right < s .length () && s .charAt (left ) == s .charAt (right )) {
22+ count ++;
23+ left --;
24+ right ++;
25+ }
26+ return count ;
27+ }
28+ }
29+
Original file line number Diff line number Diff line change 1+ public class Solution {
2+
3+ // 비트 연산자 사용
4+ public int reverseBits (int n ) {
5+ int answer = 0 ;
6+ for (int i = 0 ; i < 32 ; i ++) {
7+ answer <<= 1 ;
8+ answer |= (n & 1 );
9+ n >>>= 1 ;
10+ }
11+
12+ return answer ;
13+ }
14+
15+ // you need treat n as an unsigned value
16+ // O(1)
17+ // public int reverseBits(int n) {
18+
19+ // int answer = 0;
20+
21+ // String binary = Integer.toBinaryString(n);
22+
23+ // StringBuilder padded = new StringBuilder();
24+ // for (int i = 0; i < 32 - binary.length(); i++) {
25+ // padded.append('0');
26+ // }
27+ // padded.append(binary);
28+
29+ // return (int) Long.parseLong(padded.reverse().toString(), 2);
30+
31+ // }
32+ }
33+
You can’t perform that action at this time.
0 commit comments