求两个字符串的最大公共子串
2013-09-26 19:46
323 查看
/*求两个字符串的最大公共子串 算法原理 LCS[i,j] = 0 (i<0||j<0) LCS(i-1,j-1) (i>=0 && b>0 && (str1[i]==str2[j])) (1) 构造一个str1.size()*str2.size()的矩阵vec (2) 如果 str1[i] == str2[j],则vec[i][j] = vec[i-1][j-1]+1; LCS (Longest Common Subsequence) 算法用于找出两个字符串最长公共子串。 算法原理: (1) 将两个字符串分别以行和列组成矩阵。 (2) 计算每个节点行列字符是否相同,如相同则为 1。 (3) 通过找出值为 1 的最长对角线即可得到最长公共子串。 人 民 共 和 时 代 中 0, 0, 0, 0, 0, 0 华 0, 0, 0, 0, 0, 0 人 1, 0, 0, 0, 0, 0 民 0, 1, 0, 0, 0, 0 共 0, 0, 1, 0, 0, 0 和 0, 0, 0, 1, 0, 0 国 0, 0, 0, 0, 0, 0 为进一步提升该算法,我们可以将字符相同节点(1)的值加上左上角(d[i-1, j-1])的值, 这样即可获得最大公用子串的长度。如此一来只需以行号和最大值为条件即可截取最大子串。 人 民 共 和 时 代 中 0, 0, 0, 0, 0, 0 华 0, 0, 0, 0, 0, 0 人 1, 0, 0, 0, 0, 0 民 0, 2, 0, 0, 0, 0 共 0, 0, 3, 0, 0, 0 和 0, 0, 0, 4, 0, 0 国 0, 0, 0, 0, 0, 0 */ #include <iostream> #include <stdlib.h> #include <string> #include <vector> using namespace std; string LCS(string const &str1,string const & str2) { if(str1.size()>str2.size()) return LCS(str2,str1); vector<vector<int> > vec; vec.resize(str1.size()); for(int i=0;i<(int)str1.size();++i) { vec[i].resize(str2.size()); } int iIndex = -1; int iMax = 0; for(int i = 0;i<(int)str1.size();++i) { for(int j = 0;j<(int)str2.size();++j) { if(str1[i] == str2[j]) { int n = 1+((i>0&&j>0)?vec[i-1][j-1]:0); vec[i][j] = n; if(iMax<n) { iMax = n; iIndex = i; } } } } if(iIndex == -1) return ""; return str1.substr(iIndex-iMax+1,iMax); } int main() { string a = "adsdfefsdfghgh"; string b = "agahergaersdfefddd"; cout << LCS(a,b) << endl; system("pause"); return 0; }
相关文章推荐
- php获得两个字符串公共最大子串的函数
- 两个或N个字符串最大公共子串算法
- 关于 java中 求两个字符串中最大的公共子串之引发对return的用法探讨
- 两个字符串的最大公共子序列和最大公共子串
- 从两个顺序的字符串中寻找最大公共子串
- 求两个字符串的最大公共子串
- 求两个字符串的最大公共子串【培训第三天】
- 【字符串操作】 寻找两个字符串中的 最大公共子串
- 两个或N个字符串最大公共子串算法
- 求两个字符串最大公共子串
- 【python】实例-python实现两个字符串中最大的公共子串
- 面试题之求两个字符串的最大公共子串
- 求两个字符串的最大公共子串 ,不区分大小写
- 两个或N个字符串最大公共子串算法
- 获取两个字符串中最大的公共子串
- 动态规划算法求两个字符串的最大公共子串
- [C/C++笔面试]编程查找两个字符串中的最大公共子串
- java实现字符串匹配问题之求两个字符串的最大公共子串
- java实现字符串匹配问题之求两个字符串的最大公共子串
- LCS求两个字符串的最大公共子串