最長公共子串行(Java實現) 動態規劃

2021-08-29 20:56:21 字數 1388 閱讀 7282

【問題描述】

給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。

給定2個序列x=和y=,找出x和y的最長公共子串行。

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

設x =

y =

及它們的最長子序列

z =

則1、若 xm = yn , 則 zk = xm = yn,且z[k-1] 是 x[m-1] 和 y[n-1] 的最長公共子串行

2、若 xm != yn ,且 zk != xm , 則 z 是 x[m-1] 和 y 的最長公共子串行

3、若 xm != yn , 且 zk != yn , 則 z 是 y[n-1] 和 x 的最長公共子串行

由性質匯出子問題的遞迴結構

當 i = 0 , j = 0 時 ,        c[i][j] = 0

當 i , j > 0 ; xi = yi 時 ,  c[i][j] = c[i-1][j-1] + 1

當 i , j > 0 ; xi != yi 時 , c[i][j] = max

【程式源**】

package sf;

public class 最長公共子串行問題

}class a;

char y= ;

int m=x.length;

int n=y.length;

int c=new int[x.length+1][y.length+1];

int b=new int[x.length][y.length];

char f= new char[3];

int p = 2;

void run()

void lcslenght(int m,int n,char x,char y,int c,int b)

else if(c[i-1][j]>=c[i][j-1])

else

}} }

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

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

else

} void print()

} void show1()

system.out.println();

} }void show2() {

system.out.println("b[i][j]的值: ");

for(int i=0;i執行截圖:

Java最長公共子串行

問題描述 最長公共子串行定義 兩個或多個已知數列的子串行集合中最長的就是最長公共子串行。比如數列a abcdef 和b adefcb 那麼兩個數列的公共子串行集合有,其中最長 的就是adef,這就是最長公共子串行。注意 最長公共子串行的公共子串行裡的元素可以不相鄰,但是公共子字串必須是連線在一起的,...

動態規劃 最長公共子串行 最長公共子串C 實現

對乙個序列x和另乙個序列y,兩者的最長公共序列是,兩者最長的公共子串是 最長公共子串要求連續 用動態規劃實現最重要的是要找到遞迴方程或者迭代方程,只要把這個方程找出來了,對著這個方程想個幾十分鐘,就可以把 寫出來,然後再拿例子測試,寫出來的 基本就沒問題了。也許你第一次接觸 如何將方程轉化為 的問題...

動態規劃實現最長公共子串行

最長公共子串行的定義 1 子串行 給定兩個序列x 和序列z 若存在x的乙個嚴格遞增下標序列,使得對所有j 1,2,k,有x ij z j 則稱z是x的子串行。如 z 是x 的乙個子串行,相應下標序列為 2,3,5,7 2 公共子串行 對給定的兩個序列x和y,若序列z既是x的的子串行,也是y的子串行,...