求最长连续公共子串
2015-03-20 11:27
218 查看
说到求最长公共子串首先想到的是逐个子串比较,但是那样的话算法的复杂度太高,后来就想到用矩阵的方法去解决 思路如下:
比如字符创a:abcdefg 和字符串b:bdeabc 创建矩阵如下图所示
发现如果连续的斜线值为1的长度最长的话 则为最长公共子串 则abc为最长公共子串 ,
那我们可把矩阵进化为:
我们在计算矩阵的过程中判断如果它的值等于左上角的值+1
然后遍历矩阵找出最大值 则找到最长公共子串的结尾字符 往前移动该块的值 则为最长公共子串的起始地址;
代码如下:
ps:该代码只能求得一个最长公共子串 ,如果有多个 应该保存下来再输出
比如字符创a:abcdefg 和字符串b:bdeabc 创建矩阵如下图所示
发现如果连续的斜线值为1的长度最长的话 则为最长公共子串 则abc为最长公共子串 ,
那我们可把矩阵进化为:
我们在计算矩阵的过程中判断如果它的值等于左上角的值+1
然后遍历矩阵找出最大值 则找到最长公共子串的结尾字符 往前移动该块的值 则为最长公共子串的起始地址;
代码如下:
void FindLString(string &s1, string s2) { int i = s1.length(); int j = s2.length(); int sum = 0; int pos = 0; //开辟二维数组 int **p = new int *[i]; for (int k = 0; k < i; k++) { p[k] = new int[j]; } for (int ii = 0; ii < i; ii++) { for (int jj = 0; jj < j; jj++) { p[ii][jj] = 0; if (s1[ii]==s2[jj]) { if (ii>0 && jj>0) { p[ii][jj] = p[ii - 1][jj - 1] + 1; if (p[ii][jj]>sum) { sum = p[ii][jj]; pos = jj; } } else { p[ii][jj] = 1; } } } } for (int k = 0; k < i; k++) { delete p[k] ; } for (int ii =pos-sum+1; ii <pos+1; ii++) { cout << s2[ii]; } } int _tmain(int argc, _TCHAR* argv[]) { string a = "abcdefghaffheryeotwt"; string b = "bdeabcdffhertweituwet"; FindLString(a, b); return 0; }
ps:该代码只能求得一个最长公共子串 ,如果有多个 应该保存下来再输出
相关文章推荐
- 最长公共连续子串
- 利用后缀树求多个字符串的最长公共连续子串(Longest Common Substring)
- 最长公共子串(连续)问题
- 最长公共子串(连续)
- URAL 1517. Freedom of choice(后缀数组:最长公共连续子串)
- 常见编程——最长公共子序列(不连续)和最长公共子串(连续)
- [编程题] 最长公共连续子串(美团点评2017秋招)
- 求两个字符串的最长的连续公共子串
- 两个字符串的最长公共子串(子串为连续的)
- 两个字符串的最长连续公共子串
- 求两个字符串的最长的连续公共子串
- 牛客模拟二:最长公共连续子串
- 两个字符串的最长连续公共子串
- 求两个字符串的最长公共子串(包括连续和非连续)
- 最长公共子串(LCS)(连续与非连续)
- LCP数组的实现和最长公共连续子串
- 字符串操作:两个字符串的最长连续公共子串
- 最长回文串(可不连续)与最大公共子串(可不连续)
- 字符串题目-最长的公共连续子串
- 最长公共子序列(LCS)和最长公共连续子串