티스토리 뷰
[ LCS란? ]
LCS란 Longest Common Subsequence의 약자로 최장 공통 부문 문자열이다. 여기서 Subsequence란 연속적이지 않은 부분 문자열이다.
다음과 같은 문자열 A와 B가 있다고 하자. A = { ABCBDAB } // B = { BCDB }
이때 문자열 B는 문자열 A의 Subsequence이다. 위처럼 연속적이지는 않지만, 순서는 맞는 문자열을 Subsequence라고 한다.
LCS는 두 개의 문자열이 주어졌을 때, Common Subsequence들 중 가장 긴 문자열을 뜻한다.
[ 생각해보기 ]
아래 그림과 같이 문자열 A와 B가 있다고 가정하자.
LCS의 마지막 문자가 A라고 한다면, 문자열 X와 Y 어딘가에도 문자열 A를 포함하고 있을 것이다.그렇다면, 아래 그림에 표시된 문자열 X''와 Y'', LCS''의 관계에 대해서 생각해보자. LCS의 마지막 문자 A를 제외한 LCS"" 또한 X""와 Y""의 LCS임을 유추할 수 있다.
[ 수식 세우기 ]
문자열 X와 Y의 각각의 문자에 넘버링을 붙이고, 함수 L[ i, j ] 에 대해 다음 그림과 같이 정의한다.
1. 마지막 문자가 같을 때
문자열 X와 Y의 마지막 문자가 같을 때, LCS의 길이는 다음과 같이 나타낼 수 있다.
2. 마지막 문자가 다를 때
문자열 X와 Y의 마지막 문자가 다를 때, LCS의 길이는 다음과 같이 나타낼 수 있다.
즉, 이를 점화식으로 다시 표현하면 다음과 같다.
[ JAVA 코드 ]
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 29 30 31 32 33 34 35 36 37 38 | import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.StringTokenizer; public class Main { static BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); static StringTokenizer st; public static void main(String[] args) throws IOException { String str1 = br.readLine(); String str2 = br.readLine(); System.out.println(getLCS(str1, str2)); } public static int getLCS(String str1, String str2) { int n = str1.length(); int m = str2.length(); int[][] lcs = new int[n + 1][m + 1]; for (int i = 1; i <= n; i++) { for (int j = 1; j <= m; j++) { if (str1.charAt(i - 1) == str2.charAt(j - 1)) lcs[i][j] = lcs[i - 1][j - 1] + 1; else lcs[i][j] = Math.max(lcs[i - 1][j], lcs[i][j - 1]); } } return lcs[n][m]; } } | cs |
'알고리즘 문제 > 백준(BOJ)' 카테고리의 다른 글
[백준 16985번] Maaaaaaaaaze :: 늦깍이 IT (0) | 2019.03.25 |
---|---|
[백준 1976번] 여행가자 :: 늦깎이 IT (0) | 2019.03.25 |
[백준 1717번] 집합의 표현 :: 늦깎이 IT (0) | 2019.03.25 |
[백준 2146번] 다리 만들기 :: 늦깎이 IT (0) | 2019.03.23 |
[백준 2573번] 빙산 :: 늦깎이 IT (0) | 2019.03.23 |
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
- Total
- Today
- Yesterday
TAG
- 중간값
- 연산자 끼워넣기
- 나무 재테크
- 큐
- 알고스팟
- 정렬
- 탈주범 검거
- 트리
- 알고리즘
- 자바
- 백준
- 삼성
- 우선순위 큐
- 힙정렬
- 영역 구하기
- 최대힙
- DFS
- 리스트
- 14888
- BFS
- 배열
- 시뮬레이션
- 최소힙
- 구슬 탈출2
- SWEA
- 구현
- 힙
- 탐색
- 브루트포스
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
29 | 30 | 31 |
글 보관함