LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.
예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.
ACAYKP
CAPCAK
4
LCS에서 +1 해준다.LCS 중 큰걸 고른다.👉 부분수열에서 순서가 지켜지기 때문에 각 문자열들의 문자들을 서로 비교하면서 서로 같으면 값을 1씩 증가시키면서 누적합을 구하는 것이다.
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
public class Main {
private static Integer[][] dp;
private static char[] arr1;
private static char[] arr2;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
arr1 = br.readLine().toCharArray();
arr2 = br.readLine().toCharArray();
dp = new Integer[arr1.length][arr2.length];
System.out.println(LCS(arr1.length - 1, arr2.length - 1));
}
private static int LCS(int x, int y) {
if (x == -1 || y == -1) {
return 0;
}
if (dp[x][y] == null) {
dp[x][y] = 0;
if (arr1[x] == arr2[y]) {
dp[x][y] = LCS(x - 1, y - 1) + 1;
} else {
dp[x][y] = Math.max(LCS(x - 1, y), LCS(x, y - 1));
}
}
return dp[x][y];
}
}
charAt() 과 contains()를 곁들인...charAt()으로 원하는 글자의 index를 파악하는 데 실패했다. 이로 인해 순서를 비교할 수 없었다.