最长公共子串(LCS)
来源:互联网 发布:linux autofs 编辑:程序博客网 时间:2024/06/03 22:46
(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) 找出两个字符串的最长公共子序列
题目:输入两个字符串,求两个字符串的最长公共子序列。
首先,最长公共子序列与最长公共子串不同,子序列不要求其在原字符串是连续的。例如字符串
#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;}
0 0
- LCS(矩阵)最长公共子串
- 最长公共子串(LCS)
- 最长公共子串(LCS)
- 最长公共子串(LCS)
- 最长公共子串(LCS)
- 最长公共子串(LCS)
- LCS:最长公共子串
- 最长公共子串LCS
- LCS最长公共子串
- 最长公共子串LCS
- 最长公共子串(LCS)
- LCS 最长公共子序列&最长公共子串
- 最长公共子序列(LCS)和最长公共子串(LCSubString)
- LCS(最长公共子序列) GST(最长公共子串,广义后缀树)
- 面试(动态规划算法之:最长公共子序列 & 最长公共子串(LCS))
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- 动态规划算法之:最长公共子序列 & 最长公共子串(LCS)
- JAVA第3天学习:Java基本数据类型
- Eclipse 注释模板 函数注释 类注释 文件注释 Code Template
- 集合(四)泛型
- scala使用get/set方法、toString和构造方法
- 顺丰科技2016 内部Java基础测试
- 最长公共子串(LCS)
- 修改ActionBar右边默认图标
- 屏幕适配
- UIImageView contentMode 设置效果
- js事件绑定的几种方式与on()、bind()的区别
- 20个编写现代CSS代码的建议
- 集合(五)工具类Collections和Arrays
- 《C++ Primer》读书笔记——第六章
- 福利:工作经常用到的Mac软件整理(全)