LCS(Longest Common Subsequence, 최장 공통 부분 수열) : 여러 문자열의 부분 수열 중 공통되는 부분 수열. 그 중 가장 긴 길이를 가진 부분 수열을 뜻한다.
: 문자열 'AC'와 'C'를 비교했을 때, LCS 길이는 1이다. 만약 해당 문자열 뒤에 각각 A 문자를 더하여 비교한 것이 현재 표시한 위치이다. 즉, 현재 비교 이전 결과를 불러와 더한 것이다. 문자열 'ACA'와 'CA'를 비교했을 때, LCS 길이가 2인 것을 알 수 있다.
: 문자열 'ACA', 'CA'의 LCS 길이가 2인것은 알았다. 이제 'ACAY', 'CA'의 LCS 길이를 비교해보기 위해서, (1) 'ACAY', 'C' (2) 'ACA', 'CY' 의 LCS 길이 중 가장 큰 값을 선택한다. (Y!=A 이므로)
LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때,
모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
첫째 줄부터 N-1개의 줄에 각 노드의 부모 노드 번호를 2번 노드부터 순서대로 출력한다.
for (int i = 1; i <= S1.size(); i++) {
for (int j = 1; j <= S2.size(); j++) {
memo[i][j] = max(max(memo[i][j-1], memo[i-1][j]), memo[i-1][j-1] + S1[i-1] == S2[j-1]);
}
}
int x = S1.size(), y = S2.size();
while (memo[x][y] != 0) {
if (memo[x][y] == memo[x][y-1]) {
y--;
}
else if (memo[x][y] == memo[x-1][y]) {
x--;
}
else if (memo[x][y] - 1 == memo[x-1][y-1]) {
ans.push_back(S1[x-1]);
x--; y--;
}
}