본문 바로가기

백준/골드

[백준 5582번] 공통 부분 문자열 (C++)

문제링크 : https://www.acmicpc.net/problem/5582

 

5582번: 공통 부분 문자열

두 문자열이 주어졌을 때, 두 문자열에 모두 포함된 가장 긴 공통 부분 문자열을 찾는 프로그램을 작성하시오. 어떤 문자열 s의 부분 문자열 t란, s에 t가 연속으로 나타나는 것을 말한다. 예를 들

www.acmicpc.net

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> pii;
const int MAX = 987654321;

string s1, s2;
int dp[4001][4001];
int result;

int main()
{
    ios_base::sync_with_stdio(0); 
	cin.tie(0);

    cin >> s1 >> s2;
    for(int i=0; i<s1.size(); i++)
    {
        for(int j=0; j<s2.size(); j++)
        {
            if(s1[i]==s2[j]) 
            {
                if(i==0 || j==0) dp[i][j]=1; //0일 경우 예외처리
                else dp[i][j] = dp[i-1][j-1]+1; //길이 증가
                result = max(result, dp[i][j]); //최대값 저장
            }
        }
    }

    cout << result;
    
}

기본적인 dp 식은 s1[i] == s2[j] 일 때, dp[i][j] = dp[i-1][j-1] + 1이다.

현재 가리키는 문자들이 같을 때마다 직전 dp의 길이에 + 1을 하여 길이를 늘려나간다.

 

이때 주의해야할 것은 반복문에서 인덱스가 0부터 시작한다는 점이다.

따라서 i==0 || j==0 일 때 dp식에서 범위가 벗어나므로 이에 대한 예외처리를 해주어야 한다.

이 경우 맨 첫 번째 값에 해당하므로 시작 길이를 나타내기 위해 1로 초기화해준다.

 

이후 가장 큰 길이를 따로 저장하여 출력해주면 된다.

'백준 > 골드' 카테고리의 다른 글

[백준 3067번] Coins (C++)  (0) 2023.10.25
[백준 1068번] 트리 (C++)  (0) 2023.10.24
[백준 15681번] 트리와 쿼리 (C++)  (0) 2023.10.22
[백준 14728번] 벼락치기 (C++)  (0) 2023.10.21
[백준 2631번] 줄세우기 (C++)  (0) 2023.10.19