原文地址: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 可解