前段時間研究過如何求最長連續(xù)公共子序列和最長連續(xù)子字符串,以前一個同學(xué)正好問起來,這里貼出來解法:
問題的關(guān)鍵還是如何定義子問題,假設(shè)有:
Xm = x1 x2 x3 ... xm
Yn = y1 y2 y3 ... yn
1. 最長公共子序列(不必連續(xù))
定義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
問題歸結(jié)于求f(m, n)。依照公式用Bottom-up DP可解。
2. 最長連續(xù)子字符串(必須是連續(xù)的)
定義f(m, n)為Xm和Yn之間最長的子字符串的長度并且該子字符串結(jié)束于Xm & Yn。因為要求是連續(xù)的,所以定義f的時候多了一個要求字符串結(jié)束于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
因為最長字符串不一定結(jié)束于Xm / Yn末尾,所以這里必須求得所有可能的f(p, q) | 0 < p < m, 0 < q < n, 最大的f(p, q)就是解。依照公式用Bottom-up DP可解。
轉(zhuǎn)載自:http://blog.csdn.net/atfield/archive/2007/01/28/1496132.aspx
我的補充:最長連續(xù)子字符串問題與最大子段和問題有點類似。
posted on 2007-03-24 03:55
w2001 閱讀(1889)
評論(0) 編輯 收藏 引用 所屬分類:
算法設(shè)計