3
3
- 1 <= text1.length, text2.length <= 1000
4
4
- text1 and text2 consist of only lowercase English characters.
5
5
6
+ <Solution 1: DFS, ๋ฉ๋ชจ์ด์ ์ด์
ํ์ฉ>
7
+
6
8
Time Complexity: O(m*n)
7
9
- m์ text1์ ๊ธธ์ด, n์ text2์ ๊ธธ์ด
8
10
- @cache๋ก ์ค๋ณต ๊ณ์ฐ์ ๋ฐฉ์งํ์ฌ ๊ฐ (i,j) ์กฐํฉ์ ํ ๋ฒ๋ง ๊ณ์ฐํจ
17
19
- ๋ค๋ฅด๋ฉด: ํ์ชฝ๋ง ์ด๋ํ ๊ฒฝ์ฐ ์ค ์ต๋๊ฐ ์ ํ
18
20
3. base case: ์ด๋ ํ์ชฝ ๋ฌธ์์ด ๋์ ๋๋ฌํ๋ฉด ์ข
๋ฃ
19
21
"""
20
-
21
22
from functools import cache
22
23
class Solution :
23
24
def longestCommonSubsequence (self , text1 : str , text2 : str ) -> int :
@@ -32,3 +33,48 @@ def dfs(i, j):
32
33
return max (dfs (i + 1 , j ), dfs (i , j + 1 ))
33
34
34
35
return dfs (0 , 0 )
36
+
37
+ """
38
+ <Solution 2: DP>
39
+
40
+ Time Complexity: O(n * m)
41
+ - 2์ค for๋ฌธ์ผ๋ก ๋ชจ๋ dp[i][j] ๊ณ์ฐ
42
+
43
+ Space Complexity: O(n * m)
44
+ - (n+1) * (m+1) ํฌ๊ธฐ์ DP ํ
์ด๋ธ ์ฌ์ฉ
45
+
46
+ ํ์ด๋ฐฉ๋ฒ:
47
+ - ์ํ ์ ์: dp[i][j] = text1[:i]์ text2[:j]์ LCS ๊ธธ์ด
48
+ - Subsequence: ์์๋ง ์ ์งํ๋ฉด ๋จ
49
+ - Substring: ์ฐ์์ ์ผ๋ก ๋ํ๋์ผ ํจ
50
+
51
+ ์ ํ์:
52
+ - ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด: dp[i][j] = dp[i-1][j-1] + 1
53
+ - ๋ฌธ์๊ฐ ๋ค๋ฅด๋ฉด: dp[i][j] = max(dp[i-1][j], dp[i][j-1])
54
+
55
+ ํต์ฌ:
56
+ - dp ํ
์ด๋ธ ํฌ๊ธฐ (n+1) * (m+1): ๋น ๋ฌธ์์ด ์ผ์ด์ค ํฌํจ
57
+ - ์ต์ข
๋ต: dp[n][m] (์ ์ฒด ๋ฌธ์์ด ๋น๊ต ๊ฒฐ๊ณผ)
58
+
59
+ ๋
ธํธ:
60
+ - DP ํจํด์ ์ฐพ์๋ด๋ ์ฐ์ตํ๊ธฐ
61
+ - ๋งคํธ๋ฆญ์ค ํ์ฉ
62
+ """
63
+ class Solution :
64
+ def longestCommonSubsequence (self , text1 : str , text2 : str ) -> int :
65
+ n , m = len (text1 ), len (text2 )
66
+
67
+ # DP ํ
์ด๋ธ ์ด๊ธฐํ
68
+ dp = [[0 ] * (m + 1 ) for _ in range (n + 1 )]
69
+
70
+ # DP ํ
์ด๋ธ ์ฑ์ฐ๊ธฐ
71
+ for i in range (1 , n + 1 ):
72
+ for j in range (1 , m + 1 ):
73
+ if text1 [i - 1 ] == text2 [j - 1 ]:
74
+ # ๋ฌธ์๊ฐ ๊ฐ์ผ๋ฉด: ๋ ๋ค ์ ํ + ์ด์ ๊ฒฐ๊ณผ
75
+ dp [i ][j ] = 1 + dp [i - 1 ][j - 1 ]
76
+ else :
77
+ # ๋ฌธ์๊ฐ ๋ค๋ฅด๋ฉด: ๋ ์ค ํ๋ ์ ์ธํ๊ณ ์ต๋๊ฐ
78
+ dp [i ][j ] = max (dp [i - 1 ][j ], dp [i ][j - 1 ])
79
+
80
+ return dp [n ][m ]
0 commit comments