Algorithem/알고리즘 이론

[LCS] Longest Common Subsequence, 최장 공통 부분 수열

jamong5 2023. 6. 29. 12:00

두가지 LCS 

두 문자열의 연속된 공통 부분 : longest common substring

두 문자열의 공통 부분 : longest common subsequence

 

DP

이 문제의 핵심 풀이법은 DP 입니다.

 

연속된 공통 부분 (LCSubstring) 찾기

1. DP 채우기

집중하는 DP 칸의 문자가 서로 같다면, 그 앞까지의 문자열 LCS 값을 확인하고 +1 을 해줍니다.

if str1[i1] == str2[i2] :
    DP[i1][i2] = DP[i1-1][i2-1] + 1

 

2. 문자열 찾기

가장 값이 큰 DP 지점을 찾습니다.

거기서부터 왼쪽 방향으로 이동하면서 연속되는 문자열이 같은 부분만 뽑아냅니다.

 

공통 부분 (LCSubsequence) 찾기

1. DP 채우기

타겟 문자가 같은 경우

LCSubstring 과 같은 방식입니다.

타겟 문자가 다른 경우

이전까지의 문자열 중 LCS 값이 더 큰 걸 유지합니다.

 

2. 문자열 찾기

맨 끝 (DP 우하단) 에서부터 위의 과정을 거꾸로 진행하면 됩니다.

DP를 채울때 문자가 같은 경우 좌상칸에서 +1 해주었습니다. 문자가 다른 경우 좌 혹은 상칸에서 그 값을 그대로 가져왔습니다. 이 과정을 거꾸로 진행합니다.

1. 좌 or 상칸에 같은 값이 있다 -> 그곳으로 이동

2. 같은 값이 없다 -> 지금 칸의 문자를 결과 리스트에 저장하고 좌상칸으로 이동

끝까지 탐색하고나면 결과 리스트에는 찾고자하는 LCS의 역순 문자열이 저장됩니다.

 

아래 글이 이해에 큰 도움이 되었습니다

 

[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence

LCS는 주로 최장 공통 부분수열(Longest Common Subsequence)을 말합니다만, 최장 공통 문자열(Longest Common Substring)을 말하기도 합니다.

velog.io