前段時間研究過如何求最長連續公共子序列和最長連續子字符串,以前一個同學正好問起來,這里貼出來解法:
問題的關鍵還是如何定義子問題,假設有:
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 DP可解。
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 DP可解。
轉載自:http://blog.csdn.net/atfield/archive/2007/01/28/1496132.aspx
我的補充:最長連續子字符串問題與最大子段和問題有點類似。
posted on 2007-03-24 03:55
w2001 閱讀(1889)
評論(0) 編輯 收藏 引用 所屬分類:
算法設計