728x90
최장 공통 부분수열(Longest Common Subsequence)
최장 공통 문자열Longest common substring
- 점화식
if i == 0 or j == 0:
LCS[i][j] = 0
elif string_A[i] == string_B[j]
LCS[i][j] = LCS[i-1][j-1] + 1
else:
LCS[i][j] = 0
동작
- 문자열 A, 문자열 B의 한 글자씩 비교한다.
- 두 문자가 다르다면 LCS[i][j]에 0을 표시
- 두 문자가 같다면 LCS[i-1][j-1] 값을 찾아 + 1
- 위 과정을 반복한다.
- 이 과정이 성립하는 이유는 공통 문자열은 연속 되어야 하기 때문에 현재 두 문자가 같을 때 두 문자의 앞 글자 까지가 공통 문자열이라면 계속 공통 문자열이 이어질 것이고, 아니라면 본인부터 다시 공통 문자열을 만들어가게 될 것이다.
최장 공통 부분수열
- 점화식
if i == 0 or j == 0:
LCS[i][j] = 0
elif string_A[i] == string_B[j]
LCS[i][j] = LCS[i-1][j-1] + 1
else:
LCS[i][j] max(LCS[i-1][j],LCS[i][j-1])
동작
- 문자열 A, 문자열 B의 한 글자씩 비교한다
- 두 문자가 다르다면 LCS[i-1][j] 와 LCS[i][j-1] 중 큰 값을 표시한다.
- 두 문자가 같다면 LCS[i-1][j-1] 값을 찾아 +1 한다
- 위 과정을 반복한다.
- 부분 수열은 연속된 값이 아니다. 현재의 문자를 비교하는 과정 이전의 최대 공통 부분수열은 계속해서 유지된다.
728x90
'Computer > 알고리즘' 카테고리의 다른 글
거품 정렬(Bubble Sort) (0) | 2024.06.20 |
---|---|
AVL Tree (0) | 2024.02.04 |
동적계획법_DP(DynamicProgramming) (0) | 2024.01.26 |
그리디 알고리즘_GreedyAlgorithm (0) | 2024.01.26 |
프림_Prim (0) | 2024.01.21 |