#문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

 

#작성 코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#include <iostream>
#include <string>
using namespace std;
 
#define MAX 1000
string stra, strb;
int c[MAX+1][MAX+1];        // 0으로 채워진 행과 열을 앞에 추가. 
 
void input(){
    cin>>stra;
    cin>>strb;
}
 
int findLCS(string stra, string strb){
    // stra와 strb의 문자열을 하나하나 비교. 
    for(int i=1; i<=stra.length(); i++){
        for(int j=1; j<=strb.length(); j++){
            // 현재 비교하는 문자열이 같지 않으면
            // 이 위치 전까지 존재하는 lCS 중 가장 긴 수를 유지한다. 
            if( stra[i-1]!=strb[j-1] ){
                c[i][j] = max(c[i-1][j], c[i][j-1]);
            }
            else{
                // stra[i-1]==strb[j-1]
                // stra, strb 각각 한 문자열 전까지 lCS길이에 1을 추가한다. 
                c[i][j] = c[i-1][j-1]+1
            }
        }
    }
    return c[stra.length()][strb.length()];
}
 
int main(){
    input();
    cout<<findLCS(stra, strb);
    return 0;    
}
cs

##

어제 유튜브에서 봤던 minumum edit distance 문제와 비슷했다. https://youtu.be/b6AGUjqIPsA

'BOJ' 카테고리의 다른 글

BOJ 9370번 :: 미확인 도착지  (0) 2019.12.13
BOJ 1912번 :: 연속합  (0) 2019.12.09
BOJ 1504번 :: 특정한 최단 경로  (0) 2019.12.08
BOJ 2206번 :: 벽 부수고 이동하기  (0) 2019.12.08
BOJ 1697번 :: 숨바꼭질  (0) 2019.12.08

+ Recent posts