PS/동적 계획 알고리즘[DP]

백준 5582 공통 부분 문자열(c++)

SeungbeomKim 2022. 7. 24. 22:31
반응형

https://www.acmicpc.net/problem/5582

 

5582번: 공통 부분 문자열

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

www.acmicpc.net

<코드>

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
	string s1,s2;
	cin>>s1>>s2;
	vector<vector<int>>dp(4001,vector<int>(4001,0));
	int result = 0;
	for(int i=1;i<=s1.size();i++)
	{
		for(int j=1;j<=s2.size();j++){
			if(s1[i-1]==s2[j-1])
			{
				dp[i][j] = dp[i-1][j-1]+1;
				result = max(dp[i][j],result);
			}
		}
	}
	cout<< result<<'\n';
}

<풀이 과정>

이 문제는 LCS(최장공통부분수열)과 비슷한 문제이지만, LCS에서는 ABDCE AEBCE 이런식으로 두 부분을 비교해주면 공통수열은 ACE가 되지만, 공통 부분 문자열에서는 CE만이 부분 문자열이 된다. 즉, LCS랑은 다르게, 끊어지지 않는 공통부분문자열을 찾는 문제이다.

문자가 같을 경우에만 비교해주면 되기 때문에 비교적 해결하기 수월한 문제였다.

반응형

'PS > 동적 계획 알고리즘[DP]' 카테고리의 다른 글

백준 2579 계단 오르기(c++)  (0) 2022.08.23
백준 2294 동전 2(c++)  (0) 2022.07.29
백준 2293 동전 2(c++)  (0) 2022.07.29
백준 1958 LCS 3(c++)  (0) 2022.07.24
백준 9251 LCS(c++)  (0) 2022.07.22