LCS (dynamic programming解法)

看板CS_Softball作者 (醒悟)時間23年前 (2002/05/19 18:00), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串1/1
※ 引述《garytsai (睡吧~~)》之銘言: : 現在要求X,Y的LCS LCS指的是longest common substring還是subsequence? 我想你指的應該是後者 介紹你們一個DP (Dynamic Programming)的方法 對兩個string A: 1aa23a4a5a |A|=10 B: b1bb2b3b |B|=8 如果兩個character match得一分, 否則得零分 建一個矩陣 M, size為|B|*|A| 1 a a 2 3 a 4 a 5 a b 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 b 1 1 1 1 1 1 1 1 1 1 b 1 1 1 1 1 1 1 1 1 1 2 1 1 1 2 2 2 2 2 2 2 b 1 1 1 2 2 2 2 2 2 2 3 1 1 1 2 3 3 3 3 3 3 b 1 1 1 2 3 3 3 3 3 3 M[x][y]=max{ M[x-1][y], M[x][y-1], M[x-1][y-1] }+( 0 if A[x]!=B[y], 1 if A[x]==B[y]) 填完這個矩陣的time complexity為 O(|A|*|B|) 最右下角的數字就是LCS的長度, 要如何知道LCS是哪幾個char位於哪裡呢? 很簡單, 稍微觀察一下那個矩陣就會發現 分數發生變化的地方就是LCS的某個字元所在 由右下角往左上角找, (先上再左或先左再上都可以啦) time complexity為 O(|A|+|B|) total time complexity=O(|A|*|B|+|A|+|B| )=O(|A|*|B|) ※ 編輯: Rey 來自: 140.112.231.73 (05/19 17:47) ※ 編輯: Rey 來自: 140.112.30.18 (05/19 18:00)
文章代碼(AID): #yvtUs00 (CS_Softball)