Print
카테고리: [ Algorithm ]
조회수: 953

1. 개요

최장 공통 부분수열 문제는 LCS라고도 불린다. 이는 주어진 여러 개의 수열 모두의 부분수열이 되는 수열들 중에 가장 긴 것을 찾는 문제다.(종종 단 두 개중 하나가 되기도 한다.)

컴퓨터 과학에서 고전으로 통하는 문제이며, diff 유틸리티의 근간이 되며, 생물정보학에서도 많이 응용되고 있다. 이 문제는 연속되어 있는 공통 문자열을 찾는 최장 공통 부분문자열(longest common substring) 문제와 혼동해서는 안 된다.

2. 코드 예제

public class LongestCommonSubsequence {
    public static void main(String[] args) {
        String a = "abcdabcdabcd";
        String b = "bcda";

        LongestCommonSubsequence lcs = new LongestCommonSubsequence();
        System.out.println(lcs.solution(a, b));
    }

    private int solution(String a, String b) {
        if (a.length() == 0 || b.length() == 0) {
            return 0;
        } else if (a.charAt(0) == b.charAt(0)) {
            return 1 + solution(a.substring(1, a.length()), b.substring(1, b.length()));
        } else {
            return max(
                    solution(a.substring(1, a.length()), b.substring(0, b.length())),
                    solution(a.substring(0, a.length()), b.substring(1, b.length())));
        }
    }

    private int max(int i, int j) {
        return i > j ? i : j;
    }
}