MaxLenSubString最长公共子串
2013-09-16 02:12
330 查看
最长公共子串(LCS)
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")
b a b
c 0 0 0
a 0 1 0
b 1 0 1
a 0 1 0
我们看矩阵的斜对角线最长的那个就能找出最长公共子串。
不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。
b a b
c 0 0 0
a 0 1 0
b 1 0 2
a 0 2 0
这样矩阵中的最大元素就是 最长公共子串的长度。
在构造这个二维矩阵的过程中由于得出矩阵的某一行后其上一行就没用了,所以实际上在程序中可以用一维数组来代替这个矩阵。
代码如下:
找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。其实这又是一个序贯决策问题,可以用动态规划来求解。我们采用一个二维矩阵来记录中间的结果。这个二维矩阵怎么构造呢?直接举个例子吧:"bab"和"caba"(当然我们现在一眼就可以看出来最长公共子串是"ba"或"ab")
b a b
c 0 0 0
a 0 1 0
b 1 0 1
a 0 1 0
我们看矩阵的斜对角线最长的那个就能找出最长公共子串。
不过在二维矩阵上找最长的由1组成的斜对角线也是件麻烦费时的事,下面改进:当要在矩阵是填1时让它等于其左上角元素加1。
b a b
c 0 0 0
a 0 1 0
b 1 0 2
a 0 2 0
这样矩阵中的最大元素就是 最长公共子串的长度。
在构造这个二维矩阵的过程中由于得出矩阵的某一行后其上一行就没用了,所以实际上在程序中可以用一维数组来代替这个矩阵。
代码如下:
/* MaxLenSubString.cpp @author arhaiyun */ #include "stdafx.h" #include <cstring> #include <iostream> #include <vector> using namespace std; const char* MaxLenSubString(const char* strLeft, const char* strRight) { if(strLeft == NULL || strRight == NULL) return NULL; int lenLeft = strlen(strLeft); int lenRight = strlen(strRight); vector<int> prevLine(lenRight); vector<int> nextLine(prevLine); prevLine.assign(lenRight, 0); int maxLen = 1; int pos = 0; for(int i = 0; i < lenLeft; i++) { for(int j = 0; j < lenRight; j++) { if(strLeft[i] == strRight[j]) { if(j == 0) { nextLine[j] = 1; } else { nextLine[j] = prevLine[j - 1] + 1; if(nextLine[j] > maxLen) { maxLen = nextLine[j]; pos = j; } } } } prevLine.assign(nextLine.begin(), nextLine.end()); } char* maxLenSubStr = new char[maxLen + 1]; for(int i = 0; i < maxLen; i++) { maxLenSubStr[i] = strRight[pos - maxLen + 1 + i]; } maxLenSubStr[maxLen] = '\0'; return maxLenSubStr; } int main(int argc, char* argv[]) { char* strLeft = "yun loves xiaoyanzi"; char* strRight = "xiaoyanzi loves yun"; const char* maxLenSubStr = MaxLenSubString(strLeft, strRight); printf("%s\n", strLeft); printf("%s\n", strRight); printf("MaxLenSubString:%s\n", maxLenSubStr); system("pause"); return 0; }
相关文章推荐
- spoj1811 Longest Common Substring(LCS)最长公共子串
- HDU 1403 & POJ 2774 Longest Common Substring (后缀数组啊 求最长公共子串 模板题)
- POJ 2774 Long Long Message+Hdu 1403 Longest Common Substring (后缀数组 最长公共子串)
- SPOJ 题目1812 LCS2 - Longest Common Substring II(后缀自动机求多个串的最长公共子串)
- spoj1811 Longest Common Substring(LCS)最长公共子串
- SPOJ 1811 Longest Common Substring (后缀自动机第一题,求两个串的最长公共子串)
- 最长公共子串 Longest-Common-Substring(LCS)
- 最长公共子串 Longest common subString
- 最长公共子串(Longest-Common-Substring)
- spoj1811 Longest Common Substring(LCS)最长公共子串
- 常见算法问题之最长公共子串问题(Longest common substring problem)
- spoj1811 Longest Common Substring(LCS)最长公共子串
- hdu1403---Longest Common Substring(后缀数组求2个字符串的最长公共子串)
- HDU1403 Longest Common Substring(最长公共子串、后缀数组入门)
- spoj1811 Longest Common Substring(LCS)最长公共子串
- spoj1811 Longest Common Substring(LCS)最长公共子串
- spoj1811 Longest Common Substring(LCS)最长公共子串
- 最长公共子串(Longest common substring)
- spoj1811 Longest Common Substring(LCS)最长公共子串
- 最长公共子串(Longest Common Substring)