最長公共連續子串 全國模擬(二)

2022-08-24 01:33:11 字數 1756 閱讀 5532

[程式設計題] 最長公共連續子串

時間限制:1秒

空間限制:32768k

牛牛有兩個字串(可能包含空格),牛牛想找出其中最長的公共連續子串,希望你能幫助他,並輸出其長度。 

輸入描述:

輸入為兩行字串(可能包含空格),長度均小於等於50.

輸出描述:

輸出為乙個整數,表示最長公共連續子串的長度。

輸入例子:

abcde abgde

輸出例子:

2自己的解題思路:針對兩個字串,定義函式getequalcount來求得對於字串long從l_start開始與字串short比較得到的最長公共連續子串的長度

然後對於兩個字串,先對於a從0-length1位分別與b[0]對應求出最長公共連續子串的長度

例 abcde abc

abcde

abcabcde

abcabcde

abcabcde

abcabcde

abc再對於b從0-length2分別與a[0]對應比一遍

abcabcde

abcabcde

abcabcde

此時所有情況遍歷到,max_count為所求,輸出即可

1 #include 2

using

namespace

std;34

int getequalcount(string l,string s,int l_start,int l_len,int

s_len)517

if(l[i] ==s[j])

1822

else

2328

}29 max_count =max(max_count,count);

30return

max_count;

3132}33

intmain()

3451

for(int i=0;i)

5256

57 cout5859

return0;

60 }

參考網上,用空間換時間解題思路:

假設兩個字串str1和str2,長度分別為m和n,則構建乙個m*n的矩陣matrix,

matrix[i][j]==1表示字串str1中第i個字元與str2中第j個字元相等,為0則不相等。

統計矩陣matrix中每條斜線上1的連續最大個數就是str1和str2中公共連續子串的最大長度

例如:str1: abcde    str2: abgde 

matrix = [ 1  0  0  0  0 

0  1  0  0  0

0  0  0  0  0

0  0  0  1  0

0  0  0  0  1 ]

斜線上連續的1的最大個數為2,所以最長公共連續子串長度為2

1 #include 2

using

namespace

std;

3int

main()

4;//

構建初始矩陣matrix

11for(int i = 0;str1[i] != '

\0';i++)

1218}19

//迴圈統計每條斜線上的連續1的個數

20for(int i = 0;str1[i] != '

\0';i++)

2132

}33 cout <34return0;

35 }

最長公共連續子串

這是兩個字串,所以狀態轉移矩陣肯定是二維矩陣。另外dp i j 代表的意思不是分別乙個字串的前 i 個和另乙個字串的前 j 個字元裡面的最長連續子串。而是以a i 和b j 為末端的公共連續子串長度。如果dp i j 代表是目前最長連續子串,那麼遞推公式就寫不出來,因為不知道dp i j 中公共子串...

最長公共連續子串和最長連續公共子串行

用二維陣列c i j 記錄串x1 x2 x i x1x2 xi與y 1y 2 y j y1y2 yj 的lcs長度,則可得到狀態轉移方程c i,j 0c i 1 j 1 1max c i,j 1 c i 1,j i 0 orj 0i,j 0a ndxi y j i,j 0a ndxi y j pub...

最長公共連續子串LCS

csdn 定義dp i j 字串s1和s2的最長公共連續子串的最後乙個字元與這兩個字串的最後乙個字元相等的情況下,這個lcs的長度,狀態轉移方程為 注意觀察,a i b j 的情況下,dp i j 也等於0,這是子串行和子串在狀態轉移方程上的區別。那麼,我們通過兩層迴圈,計算出dp的值,然後找到其中...