如何求最長連續公共子序列和最長連續子字符串

原文地址:http://blog.csdn.net/ATField/archive/2007/01/28/1496132.aspx

 

前段時間研究過如何求最長連續公共子序列和最長連續子字符串,以前一個同學正好問起來,這裏貼出來解法:

問題的關鍵還是如何定義子問題,

假設有:

Xm = x1 x2 x3 ... xm

Yn = y1 y2 y3 ... yn

1. 最長公共子序列 ( 不必連續 )

定義 f(m, n) Xm Yn 之間最長的子序列的長度

於是有 f(m, 0) = f(0, m) = 0

如果 xm != yn, f(m, n) = max{ f(m-1, n), f(m, n-1) }

如果 xm = yn ,則 f(m, n) = f(m-1, n-1) + 1

問題歸結於求 f(m, n) 。依照公式用 Bottom-up Dynamic Programming 可解

2. 最長子字符串 ( 必須是連續的 )

定義 f(m, n) Xm Yn 之間最長的子字符串的長度並且該子字符串結束於 Xm & Yn 。因爲要求是連續的,所以定義 f 的時候多了一個要求字符串結束於 Xm & Yn

於是有 f(m, 0) = f(0, m) = 0

如果 xm != yn, f(m, n) = 0

如果 xm = yn, f(m, n) = f(m-1, n-1) + 1

因爲最長字符串不一定結束於 Xm / Yn 末尾,所以這裏必須求得所有可能的 f(p, q) | 0 < p < m, 0 < q < n, 最大的 f(p, q) 就是解。依照公式用 Bottom-up Dynamic Programming 可解

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章