Skip to content

Commit 69dbd75

Browse files
authored
Merge pull request #1662 from HoonDongKang/main
[HoonDongKang] Week 15 Solutions
2 parents 604f33a + 989a0cf commit 69dbd75

File tree

5 files changed

+195
-0
lines changed

5 files changed

+195
-0
lines changed

alien-dictionary/HoonDongKang.ts

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
/**
2+
* [Problem]: [892] Alien Dictionary
3+
* (https://www.lintcode.com/problem/892/)
4+
*/
5+
6+
//시간복잡도 O(n+e)
7+
//공간복잡도 O(n+e)
8+
export class Solution {
9+
/**
10+
* @param words: a list of words
11+
* @return: a string which is correct order
12+
*/
13+
alienOrder(words: string[]): string {
14+
// Write your code here
15+
const graph: Map<string, Set<string>> = new Map();
16+
17+
// 모든 문자를 그래프 노드로 초기화
18+
for (const word of words) {
19+
for (const char of word) {
20+
if (!graph.has(char)) {
21+
graph.set(char, new Set());
22+
}
23+
}
24+
}
25+
26+
// 문자 간 선후관계(edge) 설정
27+
for (let i = 1; i < words.length; i++) {
28+
const prev = words[i - 1];
29+
const curr = words[i];
30+
let isDiff = false;
31+
32+
for (let j = 0; j < Math.min(prev.length, curr.length); j++) {
33+
const p = prev[j];
34+
const c = curr[j];
35+
36+
if (p !== c) {
37+
graph.get(p)!.add(c);
38+
isDiff = true;
39+
break;
40+
}
41+
}
42+
43+
if (!isDiff && prev.length > curr.length) {
44+
return "";
45+
}
46+
}
47+
48+
const visited: Set<string> = new Set();
49+
const visiting: Set<string> = new Set();
50+
const output: string[] = [];
51+
52+
function dfs(node: string): boolean {
53+
if (visited.has(node)) return true;
54+
if (visiting.has(node)) return false;
55+
56+
visiting.add(node);
57+
58+
for (const neighbor of graph.get(node)!) {
59+
if (!dfs(neighbor)) return false;
60+
}
61+
62+
visiting.delete(node);
63+
visited.add(node);
64+
output.push(node);
65+
66+
return true;
67+
}
68+
69+
for (const node of graph.keys()) {
70+
if (!dfs(node)) return "";
71+
}
72+
73+
return output.reverse().join("");
74+
}
75+
}
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
/**
2+
* [Problem]: [105] Construct Binary Tree From Preorder And Inorder Traversal
3+
* (https://leetcode.com/problems/construct-binary-tree-from-preorder-and-inorder-traversal/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
//시간복잡도 O(n)
18+
//공간복잡도 O(n)
19+
function buildTree(preorder: number[], inorder: number[]): TreeNode | null {
20+
if (!preorder.length || !inorder.length) return null;
21+
22+
const map = new Map<number, number>();
23+
let idx = 0;
24+
25+
inorder.forEach((v, i) => map.set(v, i));
26+
27+
function dfs(left: number, right: number): TreeNode | null {
28+
if (left > right) return null;
29+
30+
const value = preorder[idx++];
31+
const root = new TreeNode(value);
32+
const index = map.get(value)!;
33+
34+
root.left = dfs(left, index - 1);
35+
root.right = dfs(index + 1, right);
36+
37+
return root;
38+
}
39+
40+
return dfs(0, inorder.length - 1);
41+
}
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/**
2+
* [Problem]: [5] Longest Palindromic Substring
3+
* (https://leetcode.com/problems/longest-palindromic-substring/)
4+
*/
5+
// 시간복잡도 O(n^2)
6+
// 공간복잡도 O(1)
7+
function longestPalindrome(s: string): string {
8+
if (s.length < 2) return s;
9+
10+
let start = 0;
11+
let end = 0;
12+
13+
function findPalindrome(left: number, right: number): void {
14+
while (0 <= left && right < s.length && s[left] === s[right]) {
15+
left--;
16+
right++;
17+
}
18+
19+
if (right - left - 1 > end - start) {
20+
start = left + 1;
21+
end = right - 1;
22+
}
23+
}
24+
25+
for (let i = 0; i < s.length; i++) {
26+
findPalindrome(i, i);
27+
findPalindrome(i, i + 1);
28+
}
29+
30+
return s.substring(start, end + 1);
31+
}

rotate-image/HoonDongKang.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
/**
2+
* [Problem]: [48] Rotate Image
3+
* (https://leetcode.com/problems/rotate-image/)
4+
*/
5+
/**
6+
Do not return anything, modify matrix in-place instead.
7+
*/
8+
// 시간복잡도 O(n^2)
9+
// 공간복잡도 O(1)
10+
function rotate(matrix: number[][]): void {
11+
const length = matrix.length;
12+
13+
for (let i = 0; i < length; i++) {
14+
for (let j = i + 1; j < length; j++) {
15+
[matrix[i][j], matrix[j][i]] = [matrix[j][i], matrix[i][j]];
16+
}
17+
}
18+
19+
for (let i = 0; i < length; i++) {
20+
matrix[i].reverse();
21+
}
22+
}
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
/**
2+
* [Problem]: [572] Subtree of Another Tree
3+
* (https://leetcode.com/problems/subtree-of-another-tree/description/)
4+
*/
5+
6+
class TreeNode {
7+
val: number;
8+
left: TreeNode | null;
9+
right: TreeNode | null;
10+
constructor(val?: number, left?: TreeNode | null, right?: TreeNode | null) {
11+
this.val = val === undefined ? 0 : val;
12+
this.left = left === undefined ? null : left;
13+
this.right = right === undefined ? null : right;
14+
}
15+
}
16+
17+
//시간복잡도 O(n*m)
18+
//공간복잡도 O(n+m)
19+
function isSubtree(root: TreeNode | null, subRoot: TreeNode | null): boolean {
20+
const pre = (node: TreeNode | null) => {
21+
if (!node) return "N";
22+
return `(${node.val},${pre(node.left)},${pre(node.right)})`;
23+
};
24+
25+
return pre(root).includes(pre(subRoot));
26+
}

0 commit comments

Comments
 (0)