第八屆藍橋杯第六題 最大公共子串(C語言)

2021-10-02 12:17:41 字數 2109 閱讀 7751

最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。

比如:「abcdkkk」 和 「baabcdadabc」,可以找到的最長的公共子串是"abcd",所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全劃線部分缺失的**。

#include

#include

#define n 256

intf

(const

char

* s1,

const

char

* s2)}}

return max;

}int

main()

輸入:

無輸出:

4填空答案為:a[i-1][j-1]+1

int

main()

同樣的輸出,呼叫函式,傳參;

intf(

const

char

* s1,

const

char

* s2)}}

return max;

}

(1)由main函式我們得知s1=abcdkkk;s2=baabcdadabc;

因為呼叫了庫函式#include所以使用了strlen函式1

來返回s1和s2的長度(即len1=s1的長度『7』,len2=s2的長度『11』);

memset(a,0,sizeof(int)*n*n);2

的意思是將二維陣列a[n][n]全部賦值為『0』;

後面乙個雙重for迴圈是用s1陣列裡面的字元依次去和s2陣列裡面的字元作判斷;如果相等的情況下:a[i][j]=___?___,且如果a[i][j]>max,max=a[i][j];

因為後面返回的是max;所以max就是我們要找的最大公共子串的長度且為乙個值,所以a[i][j]也會是賦值乙個值;

(2)我們將s1[i-1]和s2[j-1]相等的情況下稍微記錄一下,就會得到:

a[1][2]=?

a[1][3]=?

a[1][7]=?

a[1][8]=?

a[2][1]=?

a[2][4]=?

a[2][10]=?

a[3][5]=?

a[3][11]=?

a[4][6]=?

a[4][8]=?

這個時候就想到了假如相等就需要把他們特殊化(即第i位的s1陣列和第j位的s2陣列字元相同);

因為是最大的公共子串,也就是求連續最長的,我們上面把特殊的區別開,如果連續就相加,然後賦值給max;

(3)經過上面的分析,我們得到if(a[i][j] > max) max = a[i][j];就可以說是進行的判斷連續的最大值;所以我們得到a[i][j]是在求連續的最大值,而又要特殊化又要求最大值,就把特殊的賦值為1,且與前一位進行比較,注意因為是求兩個串的公共子串,而i代表s1的位數,j代表s2的位數,所以前一位時j-1,i也應該-1;

所以應該填入:

a[i]

[j]=a[i-1]

[j-1]+

1;//填空

#include

#include

#define n 256

intf

(const

char

* s1,

const

char

* s2)}}

return max;

}int

main()

函式原型:unsigned int strlen(char *str);

功能:統計字串str中字元的個數,不包括』\0』;

返回值:返回字元個數; ↩︎

函式原型:void *memset(void *str, int c, size_t n);

作用是將某一塊記憶體中的內容全部設定為指定的值, 這個函式通常為新申請的記憶體做初始化工作。 ↩︎

第八屆藍橋杯第六題最大公共子串

題目如下 最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全...

藍橋杯 最大公共子串(第八屆第六題)

請分析該解法的思路,並補全劃線部分缺失的 include include define n 256 intf const char s1,const char s2 return max int main 注意 只提交缺少的 不要提交已有的 和符號。也不要提交說明性文字。結果 a i 1 j 1 1...

第八屆藍橋杯 最大公共子串

最大公共子串長度問題就是 求兩個串的所有子串中能夠匹配上的最大長度是多少。比如 abcdkkk 和 baabcdadabc 可以找到的最長的公共子串是 abcd 所以最大公共子串長度為4。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全劃線部分缺...