最长公共子串(LCS)
2016-09-11 12:29
441 查看
(1) 找出两个字符串的最长公共子串
题目:输入两个字符串,找出两个字符串中最长的公共子串。找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。
#include<iostream> #include<string> using namespace std; int main() { string s1 = "GCCCTAGCCAGDE"; string s2 = "GCGCCAGTGDE "; int len1 = s1.size(); int len2 = s2.size(); int** c = new int* [len1]; for (int i = 0; i < len1; i++) { c[i] = new int[len2]; memset(c[i], 0, sizeof(int)*len2); } int start = -1; int end = -1; int maxLen = 0; for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { if (s1[i] == s2[j]) { int indexI = i == 0 ? 0 : (i - 1); int indexJ = j == 0 ? 0 : (j - 1); c[i][j] = c[indexI][indexJ] + 1; if (c[i][j] > maxLen) { maxLen = c[i][j]; end = i; start = i - c[i][j] + 1; } } else { c[i][j] = 0; } } } if (maxLen != 0) { string res = s1.substr(start, maxLen); cout << res << endl; } for (int i = 0; i < len1; i++) { delete[] c[i]; } return 0; }
(2) 找出两个字符串的最长公共子序列
题目:输入两个字符串,求两个字符串的最长公共子序列。首先,最长公共子序列与最长公共子串不同,子序列不要求其在原字符串是连续的。例如字符串X={A,B,C,B,D,A,B},Y={B,D,C,A,B,A},则X与Y的最长公共子序列为Z={B,C,B,A};
#include<iostream> #include<string> using namespace std; string getLongestSequence(string s1, string s2) { int len1 = s1.size(); int len2 = s2.size(); int** c = new int* [len1]; for (int i = 0; i < len1; i++) { c[i] = new int[len2]; memset(c[i], 0, sizeof(int)*len2); } int start = -1; int end = -1; int maxLen = 0; for (int i = 0; i < len1; i++) { for (int j = 0; j < len2; j++) { if (s1[i] == s2[j]) { int preMax = (i == 0 || j == 0) ? 0 : c[i - 1][j - 1]; c[i][j] = preMax + 1; } else { int preMax1 = (i == 0) ? 0 : c[i - 1][j]; int preMax2 = (j == 0) ? 0 : c[i][j - 1]; c[i][j] = max(preMax1, preMax2); } if (c[i][j] > maxLen) { maxLen = c[i][j]; } } } string res(maxLen, '-'); for (int i = len1 - 1, j = len2 - 1, index = maxLen; i >= 0 && j >= 0;) { int preC1 = i == 0 ? -1 : c[i - 1][j]; //说明s1[i]字符不在最大子序列里 if (c[i][j] == preC1) { i--; continue; } //说明s1[i]字符在最大子序列里 else { //更新结果 res[--index] = s1[i]; //说明s2[j]字符不在最大子序列里 int preC2 = j == 0 ? -1 : c[i][j - 1]; while (c[i][j] == preC2) { j--; } i--; j--; } } return res; for (int i = 0; i < len1; i++) { delete[] c[i]; } } int main() { string s1 = "ABCBDAB"; string s2 = "BDCABA"; string res1 = getLongestSequence(s1, s2); string res2 = getLongestSequence(s2, s1); if (strcmp(res1.c_str(), res2.c_str())) { cout << res1 << endl; cout << res2 << endl; } else { cout << res1 << endl; } return 0; }
相关文章推荐
- 使用谓词(NSPredicate)来提高集合遍历与过滤查找的效率
- metaClass和class的理解
- 使用百度地图遇到问题
- 链表相交问题
- Java进阶之路_重温《java编程思想》篇(三)
- 利用struts2框架实现当用户上传图片到服务器后,再显示到前台页面中
- HTML常用标签
- Android root + 修改host
- HTTP POST GET 本质区别详解
- SPSS——非参数检验——2 Related Independent sample两个相关样本检验
- MapReduce算法形式十一:自定义排序(即重写shuffle过程的排序规则)
- 将数据从HDFS上导入到Greenplum
- 华为OJ——Redraiment的走法
- Node.js中URL的解析
- 设计模式之外观模式
- 依据 smtp协议的简单golang 的发邮件实现
- 自定义带clean图标的EditText
- 初识jQuery 在笔记手打 可能有误
- MapReduce算法形式十:自定义实体类
- 拓扑排序 POJ2367Genealogical tree[topo-sort]