#include #include #include using namespace std;
//最長連續公共子串行
int maxlength(const char*str1, const char* str2, int str1_len, int str2_len)
;//c[i]j]表示以str1[i-1]和str2[j-1]字元為結尾的子串之間的最長連續公共子串,
//i,j不再表示str1[i]和str2[j],而是表示str1和str2長度的概念,與str1[i-1]和str2[j-1]對應
int maxlen = 0;
int i=0, j=0;
assert(str1 != null && str2 != null);
for (i=0; i<=str1_len; ++i)
c[i][0] = 0; //c[i][0]表示str2的長度為0的情況;
for (j=0; j<=str2_len; ++j)
c[0][j] = 0; //c[0][j]表示str1的長度為0的情況
for (i=1; i<=str1_len; ++i)
for (j=1; j<=str2_len; ++j)
if (str1[i-1] == str2[j-1])
else
return maxlen;
}
//最長連續公共子串行
int maxlength2(const char*str1, const char* str2, int str1_len, int str2_len)
;//c[i]j]表示以str1[i]和str2[j]字元為結尾的子串之間的最長連續公共子串,
int i =0;
int j = 0;
int maxlen = 0;
assert(str1 != null && str2 != null);
//處理字串長度為0的情況
if (str1_len == 0 || str2_len ==0)
return 0;
//必須從0開始,因為c[0][0]==0,會用到
for (i=0; i<=str1_len; ++i)
if (str1[i] == str2[0])
c[i][0] = 1;
else
c[i][0] = 0;
for (j=0; j<=str2_len; ++j)
if (str1[0] == str2[j])
c[0][j] = 1;
else
c[0][j] = 0;
for (i=1; imaxlen)
maxlen = c[i][j];
}else
return maxlen;
}
//注意以上兩種思想的異同點
int main()
動態規劃之最長公共子串行
最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列x 則另一串行z x的子串行是指存在乙個嚴格的下標序列,使得對於所有的j 0,1,k 1有zj xij。例如序列z 是序列x 的子串行,相應的遞增下標序列維。最長公共子串行問...
動態規劃之最長公共子串行
給出兩個字串,求出這樣的一 個最長的公共子串行的長度 子串行 中的每個字元都能在兩個原串中找到,而且每個字元的先後順序和原串中的 先後順序一致。sample input abcfbc abfcab programming contest abcd mnp sample output 4 2 0對於動...
動態規劃之最長公共子串行
最長公共子串行問題 time limit 1000 ms memory limit 65536 kib submit statistic discuss problem description 給定兩個序列x input 輸入資料有多組,每組有兩行 每行為乙個長度不超過500的字串 輸入全是大寫英文...