輸出最長公共子串行

2021-07-02 12:22:00 字數 1501 閱讀 5082

1006 最長公共子串行lcs

基準時間限制:1 秒 空間限制:131072 kb 分值: 0 難度:基礎題

給出兩個字串a b,求a與b的最長公共子串行(子串行不要求是連續的)。

比如兩個串為:

abcicba

abdkscab

ab是兩個串的子串行,abc也是,abca也是,其中abca是這兩個字串最長的子串行。

input

第1行:字串a第2行:字串b(a,b的長度 <= 1000)

output

輸出最長的子串行,如果有多個,隨意輸出1個。

input示例

abcicbaabdkscab

output示例

abca

這裡的主要目的並不在此,因此我假設大家都能理解上述的狀態轉移方程。現在我們來思考一下上面那道題目,也即輸出求得的最長公共子串行。

不難想到,我們可以通過在狀態轉移時記錄每一步的前一步狀態,然後最後通過層層回溯,找到每一步的單個序列字母,看起來問題似乎解決了?

然而事實上這樣並不太行(或者說我不會…)。因為你並不知道上一步的狀態是否是由 s[i]==t[j] 

這個條件推導出來的,因為只有這個狀態你才可以輸出序列,否則會有重複(您可以試試)。

因此,我們可以換種思路,通過層層遞迴來輸出每一步的解。表面上這種想法跟前面的一樣,事實上在實現的時候並不相同。我們給每一步狀態是由哪個條件得到分別做個標記,這樣你可以通過標記來判斷下一步遞迴是(i-1, j-1

)還是(

i-1, j

)和(i, j-1

),也就可以正確地輸出序列。

感覺**更容易理解,so

//tc_1006.cpp -- 最長公共子串行lcs

/*if( s[i]==t[j] )

dp[i+1][j+1] = dp[i][j] + 1;

else

dp[i+1][j+1] = max(dp[i+1][j], dp[i][j+1]);

*/#include #include #include #include #include #include #include #include using namespace std;

typedef long long ll;

const int maxn = 1000 + 10;

char a[maxn], b[maxn], k[maxn];

int dp[maxn][maxn];

int stal[maxn][maxn];

void print(int i, int j)

else if( stal[i][j]==1 )

print(i-1, j);

else

print(i, j-1);

}int main()

else

else

}} }

print(len1, len2);

return 0;

}

輸出最長公共子串行

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

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

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