ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 백준 5582번 : 공통 부분 문자열
    알고리즘 공부 2020. 4. 16. 13:30

      생각보다 그냥 간단하게 생각하면 풀리는 DP였다. dp[i][j]란 첫번째 string의 i번째 글자까지와 두번째 string의 j번째 글자까지 비교했을 때 마지막 글자가 포함된 제일 긴 공통 부분 문자열의 길이다.

      좀 더 구체적인 예를 들어보자면 다음과 같다. 첫번째 문자열이 ABRACA이고 두번째 문자열이 ECADADABR이라면 dp[2][3]이란 AB와 ECA를 비교했을 때 각 문자열의 마지막 문자인 B와 A가 포함된 최장 공통 부분 문자열의 길이란 뜻이다. 하지만 이 경우 B와 A가 동일하지 않으니 0이다. dp[3][9]의 경우 ABR과 ECADADABR를 비교했을 때 각 문자열의 마지막 문자인 R과 R이 포함된 최장 공통 부분 문자열의 길이란 뜻이다. 이 경우 최장 공통 부분 문자열은 ABR로 그 길이는 3이다.

     

     

      dp가 증가하는 경우는 첫번째 문자열(a)의 i번째 문자와 두번째 문자열(b)의 j번째 문자가 동일할 경우 밖에 없다. 따라서 a[i] == b[j]라면 dp[i][j] = dp[i-1][j-1] + 1인 것이다.

     

    #include <iostream>
    #include <string>
    
    using namespace std;
    
    string a, b;
    int dp[4001][4001];
    
    int strlen(string str)
    {
        int len = 0;
        while(str[len]) len += 1;
        return len;
    }
    
    int main()
    {
        ios_base :: sync_with_stdio(false);
        cin.tie(NULL);
        cout.tie(NULL);
        
        cin >> a >> b;
        
        int a_len = strlen(a);
        int b_len = strlen(b);
        int ans = 0;
        for(int i = 1; i <= a_len; i++)
        {
            for(int j = 1; j <= b_len; j++)
            {
                if(a[i-1] == b[j-1]) dp[i][j] = dp[i-1][j-1] + 1;
                ans = max(ans, dp[i][j]);
            }
        }
        
        cout << ans;
     
        return 0;
    }

    '알고리즘 공부' 카테고리의 다른 글

    백준 11051번 : 이항 계수  (0) 2020.04.21
    백준 7579번 : 앱  (0) 2020.04.17
    백준 1038번 : 감소하는 수  (0) 2020.04.14
    백준 3980번 : 선발 명단  (0) 2020.04.13
    백준 2631번 : 줄세우기  (0) 2020.04.12
Designed by Tistory.