最長公共子串行輸出路徑

2021-08-08 17:26:02 字數 1704 閱讀 9472

輸入輸出

輸入樣例

27 6

a b c b d a b

b d c a b a

8 9b a a b a b a b

a b a b b a b b a

輸出case 1

4 lcs(x,y):b c b a

case 2

6 lcs(x,y):a b a b a b

要點分析

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

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

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

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

由此可見,2個序列的最長公共子串行包含了這2個序列的字首的最長公共子串行。用c[i][j]記錄序列和的最長公共子串行的長度,xi = ;yj = 。當i = 0或j = 0時,空序列是xi和yj的最長公共子串行,此時c[i][j] = 0。

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

列印路徑

而在列印所有的路徑的時候注意:

輸出某條路徑的方法是:

程式**

#include #include #include #include #include using namespace std;

#define size 52

stack s;

char x[size],y[size];

int c[size][size];

int b[size][size];

char path[size];

int curprintn;

int lcs(int m,int n)

else if(c[i-1][j]=c[i][j-1])//up}}

return c[m][n];

}void traceback(int i,int j,int pos)

putchar('\n');

return;

}if(b[i][j]==4)

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

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

else

}int main()

{ int t,i,ct=0;

scanf("%d",&t);

while(t--)

{int len1,len2;

scanf("%d%d",&len1,&len2);

getchar();

for(i=0; i本文遇到了乙個問題,就是把區域性變數放到了全域性變數的位置。由於在回溯的時候,程式一旦執行其位置pos變數是不可測的,如果設定成全域性變數會導致很大問題,根本無法記錄

在列印所有路徑和列印乙個路徑的區別在於當時設定方向的時候,把可以向上和可以向左的方向設定為一樣,如果設定為不一樣,即告訴程式在這個地方需要跳轉2個方向,直到碰到沒有設定值的0行或0列結束,這樣就可以列印所有的路徑

輸出最長公共子串行

1006 最長公共子串行lcs 基準時間限制 1 秒 空間限制 131072 kb 分值 0 難度 基礎題 給出兩個字串a b,求a與b的最長公共子串行 子串行不要求是連續的 比如兩個串為 abcicba abdkscab ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長...

輸出最長公共子串行

試題描述 還是公共子串行,如果不知道什麼叫公共子串行,請先閱讀第0071題。本題給定兩個字串 str1 和 str2 請編寫程式求出這兩個字串最長的公共子串。如果最大長度的公共子串有多個,輸出字典序最小的那乙個。輸入兩行,每行乙個只含英文本母的字串 輸出乙個字串 輸入示例 abcdddbamn bc...

最長公共子串行 列印路徑

一 問題描述 1 若給定序列x 則另一串行z 是x的子串行是指存在乙個嚴格遞增下標序列使得對於所有j 1,2,k有 zj xij。例如,序列z 是序列x 的子串行,相應的遞增下標序列為。給定2個序列x和y,當另一串行z既是x的子串行又是y的子串行時,稱z是序列x和y的公共子串行。給定2個序列x 和y...