티스토리 뷰

알고리즘

BOJ9251 LCS java

kkoon9 2022. 1. 24. 23:18

문제

LCS(Longest Common Subsequence, 최장 공통 부분 수열)문제는 두 수열이 주어졌을 때, 모두의 부분 수열이 되는 수열 중 가장 긴 것을 찾는 문제이다.

예를 들어, ACAYKP와 CAPCAK의 LCS는 ACAK가 된다.

입력

첫째 줄과 둘째 줄에 두 문자열이 주어진다. 문자열은 알파벳 대문자로만 이루어져 있으며, 최대 1000글자로 이루어져 있다.

출력

첫째 줄에 입력으로 주어진 두 문자열의 LCS의 길이를 출력한다.

DP[i][j] = X[0 ... i]Y[0...j의 공통 부분 수열의 최대 길이

두 문자열의 길이를 조금씩 늘려 가며 확인하여, 공통 부분 수열(LCS)의 최대 길이를 계산한다.

점화식

if X[i] == Y[j]
  DP[i][j] = DP[i-1][j-1] + 1
else
	DP[i][j] = Math.max(DP[i][j-1], DP[i-1][j])

초기 DP 테이블은 0으로 만들어주자.

import java.util.*;
import java.io.*;

public class Main {
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        // StringTokenizer st = new StringTokenizer(br.readLine());
        //int N = Integer.parseInt(st.nextToken());

        String A = br.readLine();
        String B = br.readLine();
        int ASize = A.length();
        int BSize = B.length();
        int[][] dp = new int[ASize + 1][BSize + 1];

        for (int i = 1; i <= ASize; i++) {
            char a = A.charAt(i - 1);
            for (int j = 1; j <= BSize; j++) {
                char b = B.charAt(j - 1);
                if (a == b) {
                    dp[i][j] = dp[i - 1][j - 1] + 1;
                } else {
                    dp[i][j] = Math.max(dp[i][j - 1], dp[i - 1][j]);
                }
            }
        }
        int answer = Integer.MIN_VALUE;
        for (int i = 1; i <= ASize; i++) {
            for (int j = 1; j <= BSize; j++) {
                answer = Math.max(answer, dp[i][j]);
            }
        }

        System.out.println(answer);

    }
}

[알고리즘] 그림으로 알아보는 LCS 알고리즘 - Longest Common Substring와 Longest Common Subsequence

'알고리즘' 카테고리의 다른 글

BOJ1260 DFS와 BFS java  (0) 2022.01.28
BOJ1495 기타리스트 java  (0) 2022.01.25
BOJ11053 가장 긴 증가하는 부분 수열 java  (0) 2022.01.24
BOJ12865 평범한 배낭 java  (0) 2022.01.23
BOJ1904 01타일 java  (0) 2022.01.23
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/02   »
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28
글 보관함