最長公共子字串

2022-09-24 02:42:10 字數 1153 閱讀 5229

描述:

求兩個輸入序列的最長的公共子字串的長度。子字串中的所有字元在源字串中必須相鄰。

如字串:21232523311324和字串312123223445,他們的最長公共子字串為21232,長度為5。

輸入格式:

兩行,第一行為第乙個字串x,第二行為第二個字串y,字串不含空格並以回車標示結束。x和y的串長都不超過100000。

輸出格式:

兩行,第一行為最長的公共子字串的長度,第二行輸出乙個最長的公共子字串。

說明:(1)若最長的公共子字串有多個,請輸出在源字串x中靠左的那個。

(2)若最長公共子字串的長度為0,請輸出空串(乙個回車符)。

如輸入:

21232523311324

152341231

由於523和123都是最長的公共子字串,但123在源串x中更靠左,因此輸出:

3123

分析:最長公共子字串必須是連續的。如果我們使用遞迴的方法解決的話,對於每一對字元就需要判斷前面的是否已構成字串,這就會使子問題出現重複計算的問題。對於重複子問題,還是要使用動態規劃的思想。

假設需要求的字串為 str1 , str2 .函式 f(m,n) 求分別以str1[m] , str2[n] 結尾的公共字串長度。

這有一下遞推公式:

f(m,n)=0        str1[m] != str2[n] ;

f(m,n)=f(m-1,n-1) + 1      str[m]==str2[n];

別忘了遞推的特殊邊界:

f(0,n)=0;

f(m,0)=0;  

**如下:

#include

#include

using namespace std;

int c[10000][10000];

char str1[10000];

char str2[10000];

void func(int m,int n) //查詢最長子字串

cout<>str1;

cin>>str2;

m=strlen(str1);

n=strlen(str2);

func(m,n);

return 0;

}

最長公共子字串

關於題目理解,請注意和最長公共子串行的區別,最長公共子字串的解法是動態規劃,但是比較難想到表的構造方法。注意到,設給定字串為str1 和 str2 二者的長度分別是 len1 和 len2 那麼解空間大小之多是len1 len2?假設最長公共子字串為substr common,那麼substr co...

最長公共子串,字串

目前,在各大 或者是,有著不少的關於這個問題的講解,但是目前覺得都不是很清晰明白!現在普遍的解法都是用動態規劃的方式來做這道筆試題。或者是經典的面試題。這裡我做乙個自認為比較清楚的講解。說到動態規劃很多人都不會感到很陌生。但是有多少知道動態規劃什麼?精髓在 這裡僅僅提供一些個人見解,首先,動態規劃不...

最長公共字串和最長公共子串行

給出兩個字串,找到最長公共子串,並返回其長度。建立乙個矩陣來儲存兩個字串出現相同字元的地方,比如 abccd 和 abcefc 就有 abccd a10000 b02000 c00300 e00040 f00000 c00100 這樣就有每次遇到相等的都加上下他的斜上方的位置的值,然後使用乙個max...