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