LCS演算法最長公共子串行

2021-10-06 22:27:48 字數 1239 閱讀 9473

問題:

求解x和y的最長公共子串行

解析先處理序列的前 [公式] 個元素組成的子串行,然後再依次往上加後面的元素。即,用 [公式] 表示序列1和序列2前 [公式] 個元素的lcs長度,然後將 [公式] 用 [公式] 至 [公式] 表示。但是這個拆分有個問題:序列1和序列2的長度可能不等。這個問題很好解決,我們可以在較短序列的後面加上表示空元素的符號(比如null),直到兩個序列的長度變成一致的。 設計

int lcs(char *str1, char *str2, int len1, int len2, char *b, char *c)

int i, j;

for(i = 0; i <= len1; i++)

for(j = 0; j <= len2; j++)

for(i = 1; i <= len1; i++)elseelse

}} }

return 0;

}

分析:

演算法時間複雜度為o(nm)

原始碼:

#include #include #include #define left  	2

#define up 3

#define lr 4

int lcs(char *str1, char *str2, int len1, int len2, char *b, char *c)

int i, j;

for(i = 0; i <= len1; i++)

for(j = 0; j <= len2; j++)

for(i = 1; i <= len1; i++)elseelse

}} }

return 0;}

int printlcs(char *b, char *str1, int len1, int len2)

if(*(b + len1 * 7 + len2) == lr)elseelse if(*(b + len1 * 7 + len2) == left)

} return 0;}

int main(void)

printf("\n");

}printf("\n");

for(i = 0; i <= len1; i++)

printf("\n");

}printf("\n");

printlcs(*b,x,len1,len2);

return 0;

}

演算法 最長公共子串行LCS

演算法 最長公共子串行 子串行的定義 如果z是a的子串行,則a中包含z的所有排列元素,且這些元素在各自排列中的順序是一致的 例如z a 最優子結構 設c是lcs的長度 則if i 0 j 0 c i,j 0 else if x i y j c i,j c i 1,j 1 1 else if x i ...

最長公共子串行LCS演算法

思路 對所有子問題s1 1 i 和s2 1 j 進行求解。s1 1 i 表示1 i範圍的s1子串,s2 1 j 表示1 j範圍的s2子串。舉例 define n1 8 define n2 9 int s1 n1 1 int s2 n2 1 其所有子問題如下 s1 1 1 s2 1 1 求其最長公共子...

LCS 最長公共子串行

問題描述 我們稱序列z z1,z2,zk 是序列x x1,x2,xm 的子串行當且僅當存在嚴格上 公升的序列 i1,i2,ik 使得對 j 1,2,k,有 xij zj。比如z a,b,f,c 是 x a,b,c,f,b,c 的子串行。現在給出兩個序列 x和 y,你的任務是找到 x和 y的最大公共子...