[CLRS] [14-3] Dynamic Programming - Longest Common Subsequence(LCS)

2024. 11. 27. 18:09· CS Study/CLRS (자료구조 | 알고리즘)
목차
  1. 1. Longest Common Subsequence(LCS)
  2. 2. LCS 구하기
  3. 3. Code 

1. Longest Common Subsequence(LCS)

- LCS에 대해서 알아가기 전에 substring과 subsequence의 차이에 대해서 알아보자.

- substring : 연속된 부분 문자열

- subsequence : 연속되지 않은 부분 문자열

 

- 여기서 LCS는 subsequence가 최대길이를 가질때를 알고 싶기에 나오게 된 개념이다.

2. LCS 구하기

- DP로 효율적으로 문제를 해결 가능하다.

- LCS는 2개의 문자열을 비교하여 최장인 subsequence를 구해야한다.

- 문자열 'BDCABA' 와 'ABCBDAB'가 있다고 생각해보자.

- 여기서 하나의 문자열을 기준 문자열, 다른 문자열을 비교 문자열로 가정한다.

- 위 표를 보면 문자열 맨 앞에 0을 추가해주었다.

- 첫번째 행에 A값을 집어넣어보자. 각 테이블에 들어가는 값들은 LCS가 들어간다.

- 여기서 [A,C]의 의미는 'A'와 'BDC'사이의 LCS길이를 의미한다.

 

- 끝까지 반복하면 다음과 같다.

 

- 테이블의 값을 구할 때 같은 문자가 나오면 이전까지의 LCS의 길이에 +1 을 해준다.

- 여기서 이전까지의 LCS의 길이는 왼쪽 위 대각선의 값을 의미한다.

- 그래프의 값을 구하는 규칙은 다음과 같다

'''

i) 행과 열의 문자가 같다면 [i,j] = [i-1,j-1] + 1

ii)행과 열의 문자가 다르다면 [i,j] = max([i-1,j],[i,j-1])

'''

 

- 여기서 LCS는 BCBA가 된다.

 

3. Code 

standard_string = input()
compare_string = input()

dp_matrix = [[0] * (len(standard_string)+1) for _ in range(len(compare_string)+1)]
result = ''
for i in range(1,len(compare_string)+1):
    for j in range(1,len(standard_string)+1):
        if compare_string[i-1] == standard_string[j-1]:
            dp_matrix[i][j] = dp_matrix[i-1][j-1] + 1
        else:
            dp_matrix[i][j] = max(dp_matrix[i-1][j],dp_matrix[i][j-1])
            
            
length = -1
i, j = len(compare_string) , len(standard_string)
while length != 0:
    if dp_matrix[i][j] == dp_matrix[i-1][j]:
        i -=1
        length = dp_matrix[i][j]
    elif dp_matrix[i][j] == dp_matrix[i][j-1]:
        j -= 1
        length = dp_matrix[i][j]
    else:
        result += compare_string[i-1]
        i -= 1
        j -= 1
        length = dp_matrix[i][j]
        

print(result[::-1])

'CS Study > CLRS (자료구조 | 알고리즘)' 카테고리의 다른 글

[CLRS] [16] Amortized Analysis (분할 상환 분석)  (0) 2024.11.29
[CLRS] [15] Greedy Algorithm  (0) 2024.11.27
[CLRS] [14-2] Matrix Chain Multiplication  (0) 2024.11.27
[CLRS] [14-1] Dynamic Programming - rod cutting  (1) 2024.11.27
[CLRS] [13-3] LLRB Tree(Left-Leaning Red-Black Tree)  (0) 2024.11.26
  1. 1. Longest Common Subsequence(LCS)
  2. 2. LCS 구하기
  3. 3. Code 
'CS Study/CLRS (자료구조 | 알고리즘)' 카테고리의 다른 글
  • [CLRS] [16] Amortized Analysis (분할 상환 분석)
  • [CLRS] [15] Greedy Algorithm
  • [CLRS] [14-2] Matrix Chain Multiplication
  • [CLRS] [14-1] Dynamic Programming - rod cutting
23학번이수현
23학번이수현
23학번이수현
밑바닥부터 시작하는 AI보안전문가
23학번이수현
전체
오늘
어제
  • 분류 전체보기 (243)
    • Statistic Study (47)
      • Mathematical Statistics(수리통.. (47)
    • Mathematics Study (15)
      • Linear Algebra (선형대수학) (15)
    • CS Study (74)
      • CLRS (자료구조 | 알고리즘) (49)
      • Database(DB) (11)
      • C++ (11)
      • 컴퓨터 구조 (2)
      • MongoDB (1)
    • DS Study (56)
      • CS 229(Machine Learning) (19)
      • CS 224n(NLP) (5)
      • Web Scraping (7)
      • R4DS(R언어) (20)
      • 밑바닥부터 시작하는 딥러닝 1 (5)
    • Hacking Study (0)
      • Web Hacking (0)
    • 코딩테스트 (5)
      • 백준-Python (5)
    • Paper Review(논문 리뷰) (43)
      • Deep Learning (16)
      • TCGA 관련 논문 (4)
      • Computer Vision (18)
      • NLP (5)

블로그 메뉴

  • 홈
  • 태그
  • 방명록

공지사항

인기 글

태그

  • 시간복잡도
  • deep learning
  • Introduction to Algorithms
  • 자료구조
  • 수리통계학
  • 알고리즘
  • NLP
  • R언어
  • Linear Algebra
  • Algorithms
  • clrs
  • R4DS
  • 선형대수학
  • 파이썬
  • AI
  • cs229
  • 논문 리뷰
  • cs 224n
  • LSTM
  • db
  • Data Structure
  • introduction to algoritmhs
  • 정렬
  • 딥러닝
  • 백준
  • C++
  • Machine Learning
  • web scraping
  • graph
  • 데이터분석

최근 댓글

최근 글

hELLO · Designed By 정상우.v4.2.2
23학번이수현
[CLRS] [14-3] Dynamic Programming - Longest Common Subsequence(LCS)
상단으로

티스토리툴바

단축키

내 블로그

내 블로그 - 관리자 홈 전환
Q
Q
새 글 쓰기
W
W

블로그 게시글

글 수정 (권한 있는 경우)
E
E
댓글 영역으로 이동
C
C

모든 영역

이 페이지의 URL 복사
S
S
맨 위로 이동
T
T
티스토리 홈 이동
H
H
단축키 안내
Shift + /
⇧ + /

* 단축키는 한글/영문 대소문자로 이용 가능하며, 티스토리 기본 도메인에서만 동작합니다.