题目说明:

找两个字符串的最长公共子串,这个子串要求在原字符串中是连续的。比如"bab"和"caba"的最长公共子串是"ba"和"ab"。

程序代码:

#include <gtest/gtest.h>
#include <vector>
#include <algorithm>
using namespace std; int GetLCS(const string& strA, const string& strB, vector<string>& result)
{
int nLengthA = strA.length();
int nLengthB = strB.length();
int nLongest = 0;
vector<int> vecSubStrEnd; if (!nLengthA || !nLengthB)
{
return 0;
} result.clear(); // strB
// 0 1 2 3 4 5 6 7 8
// 1
// s 2
// t 3
// r 4
// A 5
// 6 char* arrRecordInfo = new char[(nLengthA + 1) * (nLengthB + 1)];
memset(arrRecordInfo, 0, (nLengthA + 1) * (nLengthB + 1)); for (int i = 1; i <= nLengthA; ++i)
{
for (int j = 1; j <= nLengthB; ++j)
{
if (strA[i-1] == strB[j-1])
{
int nNewCount = arrRecordInfo[(i-1)*(nLengthB+1) + j-1] + 1;
if (nNewCount > nLongest)
{
nLongest = nNewCount;
vecSubStrEnd.clear();
vecSubStrEnd.push_back(j);
}
else if (nNewCount == nLongest)
{
vecSubStrEnd.push_back(j);
} arrRecordInfo[i*(nLengthB+1) + j] = nNewCount;
}
}
} for (int i=0; i < vecSubStrEnd.size(); ++i)
{
int nOffset = vecSubStrEnd[i];
result.push_back(strB.substr(nOffset-nLongest, nLongest));
}
// 移除重复公共字符串
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end()); delete[] arrRecordInfo; return nLongest;
} // 一种节省空间的方法
// 在构造这个二维矩阵的过程中由于得出矩阵的某一行后其上一行就没用了,所以实际上在程序中可以用一维数组来代替这个矩阵
// 如果把strB的长度假设为短的那个字符串,空间更少
int GetLCS2(const string& strA, const string& strB, vector<string>& result)
{
int nLengthA = strA.length();
int nLengthB = strB.length();
int nLongest = 0;
vector<int> vecSubStrEnd; if (!nLengthA || !nLengthB)
{
return 0;
} result.clear(); // strB
// 0 1 2 3 4 5
// 1
// s 2
// t 3
// r 4
// A 5
// 6 char* arrRecordInfo = new char[nLengthB+1];
memset(arrRecordInfo, 0, nLengthB+1); for (int i = 1; i <= nLengthA; ++i)
{
for (int j = nLengthB; j >= 1; --j)
{
if (strA[i-1] == strB[j-1])
{
int nNewCount = arrRecordInfo[j-1] + 1;
if (nNewCount > nLongest)
{
nLongest = nNewCount;
vecSubStrEnd.clear();
vecSubStrEnd.push_back(j);
}
else if (nNewCount == nLongest)
{
vecSubStrEnd.push_back(j);
} arrRecordInfo[j] = nNewCount;
}
else
{
arrRecordInfo[j] = 0;
}
}
} for (int i=0; i < vecSubStrEnd.size(); ++i)
{
int nOffset = vecSubStrEnd[i];
result.push_back(strB.substr(nOffset-nLongest, nLongest));
}
// 移除重复公共字符串
sort(result.begin(), result.end());
result.erase(unique(result.begin(), result.end()), result.end()); delete[] arrRecordInfo; return nLongest;
} TEST(Algo, tLongestCommonSubString)
{
//
// "" ""
// abcdefg bdacafg
// abcabcagc abcdcagb vector<string> result;
ASSERT_EQ(GetLCS("","",result),0);
ASSERT_EQ(GetLCS("abcdefg","bdacafg",result),2);
ASSERT_EQ(GetLCS("abcabcagc","abcdcagb",result),3); ASSERT_EQ(GetLCS2("abcdefg","bdacafg",result),2);
ASSERT_EQ(GetLCS2("abcabcagc","abcdcagb",result),3);
}

[算法练习]最长公共子串(LCS)的更多相关文章

  1. 最长公共子串(LCS:Longest Common Substring)

    最长公共子串(LCS:Longest Common Substring)是一个非常经典的面试题目,本人在乐视二面中被面试官问过,惨败在该题目中. 什么是最长公共子串 最长公共子串问题的基本表述为:给定 ...

  2. 最长公共子串LCS(Longest Common Substring)

    一.问题描述 寻求两个字符串中的最大公共字串,其中子串是指字符串中连续的字符组成的,而不是像子序列,按照字符的前后顺序组成.如str1="sgabacbadfgbacst",str ...

  3. 最长公共子串(LCS) lg SP1811

    后缀自动机的一大用处就是求最长公共子串了 这道题的话题意就是给你两个字符串,求最长公共子串 做法的话是先使用一个字符串建立SAM,然后让另一个串在上面进行匹配 匹配的策略是优先匹配当前节点的下一个字符 ...

  4. 求两个字符串的最长公共子串(LCS)

    http://tianyunpu2008.blog.163.com/blog/static/6559379920089162236915/

  5. 《算法导论》读书笔记之动态规划—最长公共子序列 & 最长公共子串(LCS)

    From:http://my.oschina.net/leejun2005/blog/117167 1.先科普下最长公共子序列 & 最长公共子串的区别: 找两个字符串的最长公共子串,这个子串要 ...

  6. 华为OJ之最长公共子串

    题目描述: 对于两个给定的字符串,给出他们的最长公共子串. 题目分析: 1,最长公共子串(LCS)实际上是最长公共子序列的一种特殊情况,相当于是求连续的最长子序列.我们今天先解决这个特殊情况,后续博文 ...

  7. 算法设计 - LCS 最长公共子序列&&最长公共子串 &&LIS 最长递增子序列

    出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的 ...

  8. 【实习记】2014-08-29算法学习Boyer-Moore和最长公共子串(LCS)

        昨天的问题方案一:寻找hash函数,可行性极低.方案二:载入内存,维护成一个守护进程的服务.难度比较大.方案三:使用前5位来索引,由前3位增至前5位唯一性,理论上是分拆记录扩大100倍,但可以 ...

  9. 经典算法-最长公共子序列(LCS)与最长公共子串(DP)

    public static int lcs(String str1, String str2) { int len1 = str1.length(); int len2 = str2.length() ...

随机推荐

  1. day09(sql基础01)

    SQL语言的分类 SQL语言共分为四大类:数据查询语言DQL,数据操纵语言DML, 数据定义语言DDL,数据控制语言DCL.   1:数据查询语言DQL Q = Query 数据查询语言DQL用于检索 ...

  2. hdu 1155 Bungee Jumping

    http://acm.hdu.edu.cn/showproblem.php?pid=1155 Bungee Jumping Time Limit: 2000/1000 MS (Java/Others) ...

  3. ASA与PIX的区别

    很多年来,Cisco PIX一直都是Cisco确定的防火墙.但是在2005年5月,Cisco推出了一个新的产品——适应性安全产品(ASA,Adaptive Security Appliance).不过 ...

  4. C++视频课程小结(2)

    C++远征之离港篇 章节介绍: 每章小结: 第一章:大致讲了一下本章会讲的内容:引用vs指针.const vs #define(这个我在C里都没用过).函数变得更强大.内存管理要小心之类的. 第二章: ...

  5. HDU 5707 Combine String (DP,LCS变形)

    题意:给定三个字符串,问你第三个是不是由第一个和第二个组成的. 析:当时比赛是没有做出来啊...一直WA,就是没有判断长度,第一个和第二个和是不是和第三个一样,这个忘记... 我们用d[i][j]表示 ...

  6. arrayObj.splice(start, deleteCount, [item1[, item2[, . . . [,itemN]]]])

    测试方法 function test(){ var arr = [0,1,2,3]; arr.splice(1,1,'a');//case console.dir(arr); } case1: arr ...

  7. windows server 2008 支持 .net framework 4.0

    windows server 2008平台下需要安装sp1,或打KB958854补丁,IIS7.0才能支持.net framework 4.0. 否则,IIS7.0中的应用程序虽然被配置为.net 4 ...

  8. iOS设置导航栏样式(UINavigationController)

    //设置导航栏baritem和返回baiitem样式 UIBarButtonItem *barItem = [UIBarButtonItem appearance]; //去掉返回按钮上的字 [bar ...

  9. AO中的GraphicsLayer---------元素的容器

    come from AO中的GraphicsLayer---------元素的容器 图形元素(Graphic Element)是存储于GraphicsLayer中的,本文主要涉及的接口和类主要有以下几 ...

  10. 解析Ceph: Snapshot

    经常有开发者在邮件列表中会问到Ceph Snapshot的实现方式,受限于目前有限的实现文档和复杂的代码结构和代码量,弄清楚Ceph Snapshot并不是一件容易的事.正好最近在重构Ceph存储引擎 ...