: DP[i][j]에는 i 인덱스까지의 문자열 1과 j인덱스까지의 문자열 2 사이의 LCS의 길이가 저장된다.
1) (문자열 1의 길이 + 1) * (문자열 2의 길이 + 1) 크기의 2차원의 dp 배열을 만들고 모든 칸을 0으로 초기화한다.
2) i = 1, j = 1일 때
3) i = 1, j = 2일 때
4) i = 1, j = 3일 때
5) i = 1, j = 4일 때
6) i = 2, j = 1일 때
7) i = 2, j = 2일 때
8) i = 2, j = 3일 때
9) i = 2, j = 4일 때
10) 위와 같은 과정을 계속 반복하면 최종적으로 아래와 같은 dp 배열이 완성된다. 여기서 최장 공통 부분 수열의 길이는 dp 내에서 가장 큰 값인 3이 된다.
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
vector<char> string1;
vector<char> string2;
int dp[1001][1001];
int solution()
{
for (int i = 1; i <= string1.size(); i++)
{
for (int j = 1; j <= string2.size(); j++)
{
if (string1[i - 1] == string2[j - 1])
dp[i][j] = dp[i - 1][j - 1] + 1;
else
dp[i][j] = max(dp[i - 1][j], dp[i][j - 1]);
}
}
int max = 0;
for (int i = 1; i <= string1.size(); i++)
{
for (int j = 1; j <= string2.size(); j++)
{
if (max < dp[i][j])
max = dp[i][j];
}
}
return max;
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
string str1, str2;
cin >> str1 >> str2;
for (int i = 0; i < str1.size(); i++)
string1.push_back(str1[i]);
for (int i = 0; i < str2.size(); i++)
string2.push_back(str2[i]);
cout << solution();
}
👁️🗨️ 참고
https://twinw.tistory.com/126
https://velog.io/@emplam27/알고리즘-그림으로-알아보는-LCS-알고리즘-Longest-Common-Substring와-Longest-Common-Subsequence