Skip to content

Commit ac9f691

Browse files
committed
Add DP solution for Longest Common Subsequence
1 parent a8e5f12 commit ac9f691

File tree

1 file changed

+47
-1
lines changed

1 file changed

+47
-1
lines changed

longest-common-subsequence/KwonNayeon.py

Lines changed: 47 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,8 @@
33
- 1 <= text1.length, text2.length <= 1000
44
- text1 and text2 consist of only lowercase English characters.
55
6+
<Solution 1: DFS, 메모이제이션 활용>
7+
68
Time Complexity: O(m*n)
79
- m은 text1의 길이, n은 text2의 길이
810
- @cache로 중복 계산을 방지하여 각 (i,j) 조합을 한 번만 계산함
@@ -17,7 +19,6 @@
1719
- 다르면: 한쪽만 이동한 경우 중 최댓값 선택
1820
3. base case: 어느 한쪽 문자열 끝에 도달하면 종료
1921
"""
20-
2122
from functools import cache
2223
class Solution:
2324
def longestCommonSubsequence(self, text1: str, text2: str) -> int:
@@ -32,3 +33,48 @@ def dfs(i, j):
3233
return max(dfs(i + 1, j), dfs(i, j + 1))
3334

3435
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

Comments
 (0)