1. 程式人生 > >最長公共字串 Longest common subsequence problem

最長公共字串 Longest common subsequence problem

例 最長公共字串 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

這個很明顯,因為發現了一組公共元素,就看剩下的有多少公共元素。

  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的一個。

  1. 如果 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] );