반응형
LCS(Longest Common Subsequence) '최장 공통 부분 수열'로
연속된 부분 문자열 Substring과는 다른 개념이다.
가령, 아래 두 문자열이 주어졌을 때,
- A B C D H E F
- B C D E F
→ 최장 공통 Substring 'BCD'
→ 최장 공통 Subsequence는 'BCDEF'
LCS를 DP를 통해 해결할 수 있다.
도표를 통해 해석해보겠다.
ACAYKP
CAPCAK
A[i] == B[j] 인 경우, LCS[i][j] = LCS[i][j] + 1;
A[i] != B[j] 인 경우, Math.max(LCS[i-1][j], LCS[i][j-1])
LCS의 길이는 마지막 값을 출력하면 된다.
LCS의 길이(크기) 출력하는 문제는 아래 참고
그렇다면 실제 LCS의 문자열을 어떻게 찾을 수 있을까?
완성된 도표를 이용하면 쉽게 찾을 수 있다.
① 마지막 지점 (x, y)에서 부터 출발한다.
② A[x] == B[y] 이면, 대각선 방향으로 좌측상단 이동한다.
③ A[x] != B[y] 이면, 현재 LCS[x-1][y], LCS[x][y-1] 중에서 같은 값이 있는 방향으로 이동
④ x == 0 || y ==0 일 때까지 과정 ①~③을 반복. (LCS[x][y] == 0 인 지점)
⑤ 일치했던 문자를 역순으로 출력한다.
LCS의 길이와 함께 실제 공통 문자열을 출력하는 문제
반응형
'알고리즘' 카테고리의 다른 글
오일러 피(파이) 함수(Euler's phi function) (0) | 2021.02.22 |
---|---|
[문자열] KMP 알고리즘 (0) | 2021.02.22 |
소수 (Prime Number) 찾기 - 3 (0) | 2021.02.21 |
소수 (Prime Number) 찾기 - 2 (0) | 2021.02.21 |
소수(Prime Number) 찾기 - 1 (0) | 2021.02.20 |
댓글