最長公共子串行(lcs)定義:
乙個數列 s,如果分別是兩個或多個已知數列的子串行,且是所有符合此條件序列中最長的,則 s 稱為已知序列的最長公共子串行。比如數列a = 「abcdef」, b = 「adefcb」. 那麼兩個數列的公共子串行是"adef".
最長公共子串行和最長公共子字串是有區別的,公共子串行裡的元素可以不相鄰,但是公共子字串必須是連線在一起的。比如a和b的公共子字串是「def」。
求解最長公共子串行要用到動態規劃的概念。我們用c[i][j]記錄x[i]與y[j] 的lcs 的長度,那麼在計算c[i,j]之前,c[i-1][j-1],c[i-1][j]與c[i][j-1]均已計算出來。此時我們根據x[i] = y[j]還是x[i] != y[j],就可以計算出c[i][j]。問題的遞迴式寫成:
在經典的演算法導論那本書裡,文章使用了b來記錄c[i,j] 選自於哪乙個(從遞迴式裡,我們知道有三個不同的選擇),但是,我們可以不借助於陣列b而借助於陣列c本身臨時判斷c[i,j]的值是由c[i-1,j-1],c[i-1,j]和c[i,j-1]中哪乙個數值元素所確定,原理是通過我們如何選取c[i,j]來決定的。 在**裡面,我們可以看得出,**行14,15對應列印的**行31,32, **行17對應列印列印行的36到40。
**如下:
public static int lcs(string str1, string str2)
for (int j = 0; j <= str1.length(); j++)
for (int j = 1; j <= str1.length(); j++) else
}}
return opt; }
public static void print(int opt, string x, string y, int i, int j)
if (x.charat(i - 1) == y.charat(j - 1)) else if (opt[i - 1][j] >= opt[i][j]) else
}
Java最長公共子串行
問題描述 最長公共子串行定義 兩個或多個已知數列的子串行集合中最長的就是最長公共子串行。比如數列a abcdef 和b adefcb 那麼兩個數列的公共子串行集合有,其中最長 的就是adef,這就是最長公共子串行。注意 最長公共子串行的公共子串行裡的元素可以不相鄰,但是公共子字串必須是連線在一起的,...
最長公共子串行 最長公共子串
1 最長公共子串行 採用動態規劃的思想,用乙個陣列dp i j 記錄a字串中i 1位置到b字串中j 1位置的最長公共子串行,若a i 1 b j 1 那麼dp i j dp i 1 j 1 1,若不相同,那麼dp i j 就是dp i 1 j 和dp i j 1 中的較大者。class lcs el...
最長公共子串行 最長公共子串
1.區別 找兩個字串的最長公共子串,這個子串要求在原字串中是連續的。而最長公共子串行則並不要求連續。2 最長公共子串 其實這是乙個序貫決策問題,可以用動態規劃來求解。我們採用乙個二維矩陣來記錄中間的結果。這個二維矩陣怎麼構造呢?直接舉個例子吧 bab 和 caba 當然我們現在一眼就可以看出來最長公...