Algorithm/이론

[Algorithm] LCS(최장 공통 부분 수열)

SweetDev 2021. 1. 29. 06:08
input: 두 문자열
output: 겹치는 최장 길이 문자열 

LCS: Longest Common Subsequence

백준에서 LCS문제를 풀게 되었는데 이것 자체가 하나의 알고리즘이라고 해서 정리하게 되었다. 

LCS는 DP기반의 알고리즘이고, Subsequence이므로 꼭 연속은 아니어도 된다. 부분부분 잘라서 존재하기만 해도 ㄱㅊ

 

 

백준에서 들은 예는 다음과 같다. 

 

ACAYKP
CAPCAK

에서 LCS는 ACAK이다. 

 

 

 

 

이렇게 세팅해놓고 시작한다. 

 

 

글자가 같을때는 그 전줄전의값 + 1 해서 넣어주면 되는데, 다를때는 윗줄과 옆칸을 비교해서 더 큰값을 넣어준다. 

 

 

코드 !!

 

import sys

str1 = sys.stdin.readline().rstrip('\n')
str2 = sys.stdin.readline().rstrip('\n')

data = [[0] * (len(str1) + 1) for _ in range(len(str2) + 1)]
for row in range(1, len(str2) + 1):
    for j in range(1, len(str1) + 1):
        if str1[j - 1] == str2[row - 1]:
            data[row][j] = data[row-1][j - 1] + 1
        else:
            data[row][j] = max(data[row][j - 1], data[row - 1][j])
# print(data)
print(data[-1][-1])

 

근데 너무 어렵다;;