공통 부분 문자열 중 가장 길이가 긴 문자열
SubString 과 SubSequence의 차이점을 알아야함
LCS 는 서로 다른 문자열 중에서 공통 SubSequence를 찾는데, 그 중 길이가 가장 긴 SubSequence 를 찾으려 하는 것
문자열 RBKBGRBG 과, 문자열 BGKRBRKB 가 있다고 가정
이들을 아래와 같은 표로 나타낼 수 있음(첫번째 문자열 RBKBGRBG → 열에 표현)
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
편의상 맨 앞의 열과 맨 첫번째 행은 0
두 번째 문자열 BGKRBRKB 를 앞에서부터 한 글자씩 가져와서 비교(행에 표현)
B를 먼저 다음 행에 가져옴
그리고 첫 번째 RBKBGRBG 문자열 하나하나와 이 B를 비교함
표에 들어가는 값은, LCS 길이의 값이 됨
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 0 | 1 |
4-1. 이렇게 채워나가서 처음 {B}와의 비교를 모두 완성해 보면 다음과 같음
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
표를 채울 때 세 번째 행의 뒷부분부터 모두 1이 들어가게 되는 것을 알고리즘 차원에서 살펴본다면,
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 |
따라서 표에는 1이 들어갑니다.
이것을 알고리즘 차원에서 살펴본다면,
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 | 1 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 | 1 | 1 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 | 1 | 1 | 1 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 | 1 | 1 | 1 | 2 |
0 | R | B | K | B | G | R | B | G | |
---|---|---|---|---|---|---|---|---|---|
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
B | 0 | 0 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
G | 0 | 0 | 1 | 1 | 1 | 2 | 2 | 2 | 2 |
K | 0 | 0 | 1 |
for (int i = 1; i <= lenA; i++) {
for (int j = 1; j <= lenB; j++) {
if (a.charAt(i-1) == b.charAt(j-1)) {
dp[i][j] = dp[i-1][j-1] + 1;
} else {
dp[i][j] = Math.max(dp[i-1][j], dp[i][j-1]);
}
}
}