1、一些概念
子串行:就是將原序列中的0個或多個元素去掉之後得到的序列。子串行不一定在原序列中連續。比如:x=中的乙個子串行可以為:,也可以是: 。
2、問題描述
現有兩個序列分別為:x=和y=.求x和y的長度最大的公共子串行。
3、問題解析
要尋找x和y的最長公共子串行,可以從前往後找,也可以從後向前找,若存在多個長度相同的最長公共子串行,則這兩種方法找出來的序列可能不一樣,但都是最長的公共子串行。
現在主要介紹從後向前找的方法,從前向後找也類似。對於兩個序列x和y,長度分別為:len1和len2,假設其最長公共子串行為z,其長度為len,查詢過程如下:
1)若x[len1]==y[len2],則將x[len1]賦給z[len],然後x和y同時向前移動乙個位置。
2)若x[len1]!=y[len2],且x[len1] != z[len],這時x[len1-1]和y的最長公共子串行為z。
3)若x[len1] != y[len2],且y[len2] != z[len],這時x和y[len2-1]的最長公共子串行為z。
在此,我們使用陣列c[i, j]來表示x[i]和y[j]的最長公共子串行的長度。則z的長度為c[len1, len2]。根據以上分析,我們可以得出
if i==0 or j==0, 則c[i, j]=0;
if i,j >0 且xi == yj,則c[i, j] = c[i-1, j-1]+1;
if i,j >0 且xi != yj,則c[i, j] = max
else if(c[i-1][j] > c[i][j-1])
else
}maxlen = c[len1][len2];
return maxlen;
}//time: o(len1+len2)
void lcs_print(char *str1, int len1, int len2)
else if(c[len1][len2] == c[len1][len2-1])
else }
int main()
return 0;
}
動態規劃之最長公共子串行演算法
動態規劃之最長公共子串行演算法 演算法思想 假設x x1,x2,xm y static void init xy void getchar for i 1 i n i getchar static void lcs length void else if c i 1 j c i j 1 else p...
動態規劃之最長公共子串行
最長公共子串行簡介 舉例說明並分析 塊測試結果 乙個給定序列的子串行是在該序列中刪去若干元素後得到的序列,確切的說,若給定序列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對於動...