問題:
求解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的最大公共子...