最長公共字串 Longest common subsequence problem
阿新 • • 發佈:2018-11-07
例 最長公共字串 Longest common subsequence problem
問題描述:這個,很。。。顯而易見吧,不知道的,。。。看這裡 http://en.wikipedia.org/wiki/Longest_common_subsequence_problem
當然這裡,我們也是要先找遞迴的。假設我的兩個sequence,一個是X,長度為n;另一個是Y,長度為m。
現在假設我有兩個point,一個是i,指在X的最後一個元素上,另一個是j,指在Y的最後一個元素上。我們的遞迴應該是分三種情況的。
1)如果X[i] == Y[j] 那麼LCS(X[i],Y[j]) = LCS(X[i-1],Y[j-1]) + 1
這個很明顯,因為發現了一組公共元素,就看剩下的有多少公共元素。
- 如果X[i] != Y[j] 那麼 LCS(X[i],Y[j]) = max( LCS(X[i-1], Y[j]), LCS(X[i], Y[j-1]) )
這個其實也很容易相同,就是如果發現不同的,就去掉X或Y的最後一個,然後和另一個完整的比較,這樣去掉X還是Y的最後一個,就有兩種可能,所以就是要找中間max的一個。
- 如果 i=0 或者 j=0,就return 0
因為有一個sequence已經完了。
所以遞迴這裡還是比較明顯的:
LCS(n,m){ if m==0 || n==0 return 0; if(X[n] == Y[m]) return LCS(n-1,m-1)+1; else return max( LCS(n,m-1), LCS(n-1,m) ); }
現在有了遞迴,我們就應該能把它寫成tabular的DP。
初始化:Table LCS的第一行第一列都設為0。
for i = 1 to m
for j = 1 to n
if(X[i]==Y[j])
LCS[i,j] = LCS[i-1,j-1]+1;
else
LCS[i,j] = max(LCS[i,j-1], LCS[i-1,j] );