問題描述:
給定兩個字串,求解這兩個字串的最長公共子串行(longest common sequence)。比如字串1:bdcaba;字串2:abcbdab
則這兩個字串的最長公共子串行長度為4,最長公共子串行是:bcba
問題解決:
1>.窮舉法:列舉出所有的可能,但其時間複雜度較高不可取。
2>.遞迴法:
設x=,y=為兩個序列,z=是他們的任意公共子串行
經過分析,我們可以知道:
1、如果xm = yn,則zk = xm = yn 且 zk-1是xm-1和yn-1的乙個lcs
2、如果xm != yn 且 zk != xm,則z是xm-1和y的乙個lcs
3、如果xm != yn 且 zk != yn,則z是x和yn-1的乙個lcs
所以如果用乙個二維陣列c表示字串x和y中對應的前i,前j個字元的lcs的長度話,可以得到以下公式:
// 最長公共子串行
public
static
int num=0;
public
static
intlcslength
(string x ,string y,
int i,
int j,
int[
] c,
int[
] s)
else
else
}return c[i]
[j];
}public
static
void
trackback
(int
s,string x,
int i,
int j)
//行-1
else
if(s[i]
[j]==2)
else
trackback
(s,x,i,j-1)
;}public
static
void
main
(string[
] args)
system.out.
println()
;}//列印s
for(
int i =
0; i < s.length; i++
) system.out.
println()
;}trackback
(s,x,x.
length()
-1,y.length()
-1);
}
演算法設計與分析 5 最長公共子串行
書本 演算法分析與設計 功能 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列 使得對於所有j 1,2,k有 zj xij.給定兩個序列x 和y 找出x和y的最長公共子串行 檔案 mostlength.cpp include define maxlen 100 using nam...
演算法設計與分析 2 最長公共子串行
有序列x 和y 找出它們的最長公共子串行。可以按以下方式遞迴進行 當xm yn時,找出xm 1與yn 1的最長公共子串行,然後在尾部加上xm xm yn 即可得x與y的最長公共子串行。當xm不等於yn時,必須解兩個子問題,即找出xm 1與y的最長公共子串行及x與yn 1的最長公共子串行,這兩個公共子...
最長公共子串行 與 最長公共子串
最長公共子串行 常用於解決字串的相似度,是指在母串中都出現過並且出現順序與母串保持一致的子串,不要求連續性。最長公共子串 是指在母串中連續出現的子串。例如 cnblogs belong 最長公共子串行為blog,最長公共子串為lo假設z z2,zk 是母串 x 與 y的最長公共子串行lcs,那麼 用...