-
백준 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