最大公共子串長度問題就是:求兩個串的所有子串中能夠匹配上的最大長度是多少。
比如:「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。下面的程式是採用矩陣法進行求解的,這對串的規模不大的情況還是比較有效的解法。請分析該解法的思路,並補全劃線部分缺...