반응형
LCS는 longest common subsequence의 약자입니다. 우리나라 말로는 최장 공통 부분 수열을 의미합니다.
이해하기 쉽도록 longest common substring 과 비교해보겠습니다.
substring은 연속된 부분 문자열이고 subsequence는 연속적이지는 않은 부분 문자열이다.
예를 들어 iamaboy에서 amab는 연속하는 부분 문자열이므로 substring이 되고 aaby는 순서는 일치하지만 연속적이지는 않는 subsqeunce가 됩니다.
LCS 개수 구하기 |
그렇다면 두 문자열에서의 LCS는 어떻게 구할까요?
예시를 들겠습니다. 두 문자열은 ACCGATCG와 GACAT 입니다.
우선 전체는 아래와 같은 구조입니다. ( 아래에 설명이 나옵니다. 우선은 이해하지 마시고 그렇구나 넘어가세요.)
문자열 ACCG와 G의 부분 수열은 G하나 입니다.
문자열 ACCGATCG와 G의 최대 부분 수열은 G하나 입니다.
문자열 ACCGATCG와 GA의 최대 부분 수열은 G,A 총 2개 입니다.
위와 같은 형태로 진행하다보면 아래와 같은 그림이 만들어 지는 것입니다.
점화식의 형태로 나타낸다면,
만약 두 알파벳이 같을때, dp[i][j] = dp[i -1][j - 1] +1
두 알파벳이 다를때는 dp[i][j] = max(dp[i -1][j], dp[i][j -1])
LCS관련 문제 모음입니다.
다 풀어보세요!
백준 알고리즘
반응형
'알고리즘' 카테고리의 다른 글
[백준] 2470-두 용액(C++) (0) | 2021.05.25 |
---|