最長公共子串行

2021-09-05 11:46:23 字數 1268 閱讀 1139

1.問題描述

輸入: x= y=

輸出:z=x和y的最長公共子串行

2.實驗目的

通過實驗掌握求最長公共子串行的演算法,理解動態規劃的思想方法,練習程式設計以加深理解。

3.實驗原理

最長公共子串行問題具有最優子結構性質

設序列x=,y=的最長公共子串行為z=,則

(1)若xm=yn,則zk=xm=yn,且zk-1是xm-1和yn-1的最長公共子串行。

(2)若xm≠yn,且zk≠xm,則z是xm-1和yn的最長公共子串行。

(3)若xm≠yn,且zk≠yn,則z是xm和yn-1的最長公共子串行。

由最優子結構性質可知,要找出最長公共子串行可以按一下方式遞迴進行:當xm=yn時,找出xm-1和y-1的最長公共子串行,然後再起尾部加上xm(yn)即可得到最長公共子串行。當xm≠yn時,必須解決兩個子問題,即x和yn-1的最長公共子串行,xm-1和y的最長公共子串行,然後取較長的乙個解。由以上遞迴方式可知最長公共子串行問題具有子問題重疊性質。

同時具有最優子結構性質和子問題重疊性質就可以採用動態規劃的方法進行設計。先求出問題的最優值,然後通過最優值去找出問題的最優解。

4.實驗設計

由最優子結構性質可建立遞迴關係如下

c[i][j]=0 (i=0,j=0)

c[i][j]=c[i-1][j-1]+1 (i,j>0;xi=yj)

c[i][j]=max (i,j>0;xi≠yj)

private static int lcslength(char x, char y)

for(i=0;i<=y.length;i++)

for(i=1;i<=x.length;i++)else if(c[i-1][j]>=c[i][j-1])else}}

return b;

}通過lcslength演算法求得最優值,然後通過最優值在lcs演算法中構造最優解

private static void lcs(int i, int j, char x,int b)

if(b[i][j]==1)else if(b[i][j]==2)else if(b[i][j]==3)

}5.實驗結果與分析

由於每個陣列單元的時間複雜度為o(1)所以lcslength演算法的時間複雜度為o(m*n),在lcs中每一次遞迴呼叫是i或j減1,所以時間複雜度為o(m+n)

6.結論

最長公共子串行問題只是動態規劃的乙個例項,所有具有最優子結構性質和重疊子問題性質的問題都可以用動態規劃思想求解,而動態規劃的一般步驟是先求出最優值,然後根據最優值構造最優解。

最長公共子串行 最長公共子串

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 當然我們現在一眼就可以看出來最長公...

最長公共子串 最長公共子串行

子串要求連續 子串行不要求連續 之前的做法是dp求子序列 include include include using namespace std const int inf 0x3f3f3f3f const int mod 1000000007 string s1,s2 int dp 1010 10...