描述:
求兩個輸入序列的最長的公共子字串的長度。子字串中的所有字元在源字串中必須相鄰。
如字串: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...