Skip to content

Commit ac2c3d5

Browse files
authored
Merge pull request DaleStudy#614 from mangodm-web/main
[mangodm-web] Week15 Solutions
2 parents 0991abb + 814dc18 commit ac2c3d5

File tree

3 files changed

+114
-0
lines changed

3 files changed

+114
-0
lines changed
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
class Solution:
2+
def is_palindrome(self, s: str) -> bool:
3+
return s == s[::-1]
4+
5+
def longestPalindrome(self, s: str) -> str:
6+
"""
7+
- Idea: 아래의 방법으로 주어진 문자열에서 가장 긴 팰린드롬을 찾는다.
8+
1. 모든 가능한 부분 문자열 생성
9+
2. 각 부분 문자열이 팰린드롬인지 확인
10+
3. 가장 긴 팰린드롬을 저장하고 반환
11+
- Time Complexity: O(n^3). n은 문자열의 길이
12+
모든 부분 문자열을 구하는데 O(n^2), 각 부분 문자열이 팰린드롬인지 알아내는데 O(n).
13+
결국 O(n^3)의 시간이 소요된다.
14+
- Space Complexity: O(n). n은 문자열의 길이
15+
팰린드롬인지 확인할 때 문자열 슬라이싱을 사용하는데,
16+
최악의 경우 부분 문자열의 길이가 입력 문자열의 길이와 같아
17+
공간 복잡도는 O(n)이다.
18+
"""
19+
20+
result = s[0]
21+
22+
for i in range(len(s) - 1):
23+
for j in range(i + 1, len(s) + 1):
24+
if j - i <= len(result):
25+
continue
26+
27+
if self.is_palindrome(s[i:j]) and (j - i) > len(result):
28+
result = s[i:j]
29+
30+
return result
Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
from typing import Optional
2+
3+
4+
class TreeNode:
5+
def __init__(self, val=0, left=None, right=None):
6+
self.val = val
7+
self.left = left
8+
self.right = right
9+
10+
11+
class Solution:
12+
def isSubtree(self, root: Optional[TreeNode], subRoot: Optional[TreeNode]) -> bool:
13+
if not subRoot:
14+
return True
15+
if not root:
16+
return False
17+
18+
if self.isSameTree(root, subRoot):
19+
return True
20+
21+
has_subroot_in_left = self.isSubtree(root.left, subRoot)
22+
has_subroot_in_right = self.isSubtree(root.right, subRoot)
23+
24+
return has_subroot_in_left or has_subroot_in_right
25+
26+
def isSameTree(self, p: Optional[TreeNode], q: Optional[TreeNode]) -> bool:
27+
"""
28+
- Idea: 두 트리를 다음과 같이 노드 단위로 비교한다.
29+
1. 두 노드가 모두 None이라면 현재 두 트리는 동일
30+
2. 두 노드가 None이 아니고 값이 같다면, 왼쪽과 오른쪽 자식 노드를 재귀적으로 비교
31+
3. 두 노드가 다르거나 한쪽만 None이면 두 트리는 상이
32+
- Time Complexity: O(m). m은 더 작은 트리의 노드 수
33+
각 노드를 한번씩 방문하므로 O(m) 시간이 걸린다.
34+
- Space Complexity: O(h). h는 더 작은 트리의 높이
35+
재귀 호출 스택에 최대 h만큼의 공간이 사용된다.
36+
"""
37+
38+
if not p and not q:
39+
return True
40+
41+
if p and q and p.val == q.val:
42+
is_left_equal = self.isSameTree(p.left, q.left)
43+
is_right_equal = self.isSameTree(p.right, q.right)
44+
45+
return is_left_equal and is_right_equal
46+
47+
return False
Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
from typing import Optional
2+
3+
4+
# Definition for a binary tree node.
5+
class TreeNode:
6+
def __init__(self, val=0, left=None, right=None):
7+
self.val = val
8+
self.left = left
9+
self.right = right
10+
11+
12+
class Solution:
13+
def isValidBST(self, root: Optional[TreeNode]) -> bool:
14+
"""
15+
- Idea: 각 노드 값의 허용 범위를 정하고 재귀적으로 검사한다.
16+
1. BST의 정의 활용
17+
왼쪽 서브트리의 모든 값은 현재 노드 값보다 작고, 오른쪽 서브트리의 모든 값은 현재 노드 값보다 큼.
18+
2. 초기값의 범위를 (-inf, inf)로 설정
19+
3. 각 노드의 값을 검사하고, 범위를 업데이트해서 재귀적으로 서브 트리 확인
20+
- Time Complexity: O(n). n은 트리의 노드 수
21+
모든 노드를 한번씩 방문한다.
22+
- Space Complexity: O(h). h는 트리의 높이
23+
재귀 호출 스택이 트리의 높이만큼 공간을 필요로 한다.
24+
편향된 트리라면 O(n)이 필요하다.
25+
"""
26+
27+
def isValid(node: Optional[TreeNode], low: float, high: float) -> bool:
28+
if not node:
29+
return True
30+
if not (node.val < high and node.val > low):
31+
return False
32+
33+
return isValid(node.left, low, node.val) and isValid(
34+
node.right, node.val, high
35+
)
36+
37+
return isValid(root, float("-inf"), float("inf"))

0 commit comments

Comments
 (0)