최장 공통 부분 수열(Longest Common Subsequence)
두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
diff 명령은 LCS 문제를 해결하는 데 기반을 둔다.
diff utility
다음과 같이 두 항목이 있다고 하자.
a b c d f g h j q z
a b c d e f g i j k r x y z
여기서 공통이 되는 가장 긴 부분은 다음과 같다.
a b c d f g j z
두개 항목을 비교하여 추가(+)되거나 삭제(-)된 부분을 다음과 같이 나타낸다.
e h i q k r x y + - + - + + + +
LCS 함수의 정의
두 수열은 다음과 같이 정의.
, .
Python Code
A = "ACAYKP"
B = "CAPCAK"
lcs = [[0 for i in range(len(A)+1)] for j in range(len(B)+1)]
for i in range(1, len(A)+1):
for j in range(1, len(B)+1):
if A[i-1] == B[j-1]:
lcs[i][j] = lcs[i-1][j-1] + 1
else:
lcs[i][j] = max(lcs[i][j-1], lcs[i-1][j])
print(lcs[len(A)][len(B)])
lcs 출력결과
0 0 0 0 0 0 0 0 0 1 1 1 1 1 0 1 1 1 2 2 2 0 1 2 2 2 3 3 0 1 2 2 2 3 3 0 1 2 2 2 3 4 0 1 2 3 3 3 4
참조
'아카이빙' 카테고리의 다른 글
정렬된 두 배열을 병합하기 (0) | 2018.05.24 |
---|---|
Python으로 알고리즘 공부 12. 최소 신장 트리 - Kruskal 알고리즘 (0) | 2017.07.20 |
Python으로 알고리즘 공부 10. 연쇄행렬 최소곱셈 알고리즘 (0) | 2017.07.14 |
Python으로 알고리즘 공부 09. 정수의 제곱 계산 (0) | 2017.07.13 |
Python으로 알고리즘 공부 08. 최대공약수, 최소공배수 알고리즘 (2) | 2017.07.08 |