面试题[动态规划]: 最长公共子序列
2015-03-25 15:19
232 查看
问题:输入两个字符串,返回最长公共子序列。
最长公共子序列问题(Longest Common Subsequence)是经典的动态规划问题,可以通过以下方式来求解较小规模的问题:
在找A和B的公共子序列时:
如果有am-1==bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列;
如果am-1!=bn-1,则要解决两个子问题:
找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;
找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列;
再取两者中较长者作为A和B的最长公共子序列。
C++代码实现如下:
参考链接:/article/1422816.html
最长公共子序列问题(Longest Common Subsequence)是经典的动态规划问题,可以通过以下方式来求解较小规模的问题:
在找A和B的公共子序列时:
如果有am-1==bn-1,则进一步解决一个子问题,找“a0,a1,…,am-2”和“b0,b1,…,bm-2”的一个最长公共子序列;
如果am-1!=bn-1,则要解决两个子问题:
找出“a0,a1,…,am-2”和“b0,b1,…,bn-1”的一个最长公共子序列;
找出“a0,a1,…,am-1”和“b0,b1,…,bn-2”的一个最长公共子序列;
再取两者中较长者作为A和B的最长公共子序列。
C++代码实现如下:
[code] string LCS(string str1, string str2) { int len1 = str1.size(); int len2 = str2.size(); vector<vector<int> > c(len1 + 1, vector<int>(len2 + 1, 0)); for (int i = 1; i <= len1; ++i) for (int j = 1; j <= len2; ++j) if (str1[i - 1] == str2[j - 1]) c[i][j] = c[i - 1][j - 1] + 1; else c[i][j] = max(c[i - 1][j], c[i][j - 1]); int len = c[len1][len2]; string res(len, 0); int i = len1, j = len2; while (i && j) { if (str1[i - 1] == str2[j - 1]) { res[--len] = str1[--i]; --j; } else c[i - 1][j] > c[i][j- 1] ? --i : --j; } return res; }
参考链接:/article/1422816.html
相关文章推荐
- 【算法】 动态规划 最长公共子序列
- 动态规划DP_最长公共子序列LCS
- 动态规划解最长公共子序列问题
- C++求解汉字字符串的最长公共子序列 动态规划
- 动态规划学习笔记2(最长公共子序列)
- 【动态规划】最长公共子序列与最长公共子串
- 【算法导论实验4】动态规划-最长公共子序列LCS
- 算法导论学习笔记(十二):动态规划(二):最长公共子序列(LCS)
- 求两字符串最长公共子序列——动态规划
- 最长公共子序列和最长公共子串(动态规划)总结
- MOOC清华《程序设计基础》第6章:最长公共子序列问题(动态规划)
- 动态规划求最长公共子序列以及最长公共子串
- 【jzoj5237】【GDOI2018模拟8.7】【最长公共子序列 】【动态规划】
- 【动态规划】之最长公共子序列长度(难度:1星)
- 编辑距离和最长公共子序列(动态规划经典题)
- 动态规划—最长公共子序列问题
- 算法导论实验五_动态规划求最长公共子序列
- 《剑指offer》面试题14:剪绳子(动态规划、贪婪算法)
- 转载 动态规划 (Dynamic Programming) 之 最长公共子序列(Longest Common Subsequence)
- (动态规划DP)面试题:求数组中两个数的最大差值(只能下标大的减去下标小的)符合无后效性