题目要求:
如果字符串一的所有字符按其在字符串中的顺序出现在另外一个字符串中,则字符串一称为字符串二的子串。
注意,并不是要求子串(字符串一)的字符必须连续出现在字符串二中。
请编写一个函数,输入两个字符串,求它们的最长公共子序列,并打印出最长公共序列。
例如:输入两个字符串BDCABA和ABCBDAB,字符串BCBA、BDAB和BCAB都是它们的最长公共子序列,则输出它们的长度4,并打印任意一个子序列。
题目分析:
参考链接:http://blog.youkuaiyun.com/yysdsyl/article/details/4226630
代码实现:
#include <iostream> using namespace std; #define MAXLEN 100 void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN]) { int i, j; for(i = 0; i <= m; i++) c[i][0] = 0; for(j = 1; j <= n; j++) c[0][j] = 0; for(i = 1; i<= m; i++) { for(j = 1; j <= n; j++) { if(x[i-1] == y[j-1]) { c[i][j] = c[i-1][j-1] + 1; b[i][j] = 0; } else if(c[i-1][j] >= c[i][j-1]) { c[i][j] = c[i-1][j]; b[i][j] = 1; } else { c[i][j] = c[i][j-1]; b[i][j] = -1; } } } } char Store[MAXLEN] = { 0}; int step = 0; void PrintLCS(int b[][MAXLEN], char *x, int i, int j) { if

这道微软面试题要求找到两个字符串的最长公共子序列,不强制要求子序列连续出现。给出的例子是BDCABA和ABCBDAB,它们的最长公共子序列长度为4,如BCBA、BDAB、BCAB。解决方案可以通过动态规划来实现,使用二维矩阵记录中间结果。若要输出所有最长公共子序列,可以遍历所有可能的情况。对于连续的最长公共子串,可以通过改进的二维矩阵算法找到。
最低0.47元/天 解锁文章
649

被折叠的 条评论
为什么被折叠?



