演算法設計與分析 最長公共子串行

2021-10-06 11:49:39 字數 1417 閱讀 1221

問題描述:

給定兩個字串,求解這兩個字串的最長公共子串行(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,那麼 用...