博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[算法练习]最长公共子串(LCS)
阅读量:7223 次
发布时间:2019-06-29

本文共 3359 字,大约阅读时间需要 11 分钟。

题目说明:

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

 

程序代码:

#include 
#include
#include
using namespace std;int GetLCS(const string& strA, const string& strB, vector
& result){ int nLengthA = strA.length(); int nLengthB = strB.length(); int nLongest = 0; vector
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
& result){ int nLengthA = strA.length(); int nLengthB = strB.length(); int nLongest = 0; vector
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
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);}

转载于:https://www.cnblogs.com/Quincy/p/4894906.html

你可能感兴趣的文章
33个优秀的 jQuery 图片展示插件分享
查看>>
使用Identity Server 4建立Authorization Server (4)
查看>>
Docker
查看>>
精通SpringBoot——第四篇:Spring事件 Application Event
查看>>
ThreadPoolExecutor详解
查看>>
真能“穿墙识人”,MIT人体姿态估计系统创历史最高精度!
查看>>
今日科技联播:阿里“文案妹”逗比搞怪样样在行,每秒可撰20000广告文案
查看>>
小米涉足银行业 联合新希望集团成立民营银行
查看>>
用私服修复Maven仓库依赖引用(加载)不下来的问题
查看>>
中国四大银行IT基础架构去IOE问题思考和探讨
查看>>
Spark RDDRelation
查看>>
解决ssh登录后闲置时间过长而断开连接
查看>>
ADB server didn't ACK 解决方法
查看>>
奥迪与Alta达成合作,将为电动汽车打造太阳能天窗
查看>>
【连载】物联网全栈教程-从云端到设备(十一)---调用阿里云API,获取物的属性。...
查看>>
美军制造3D打印无人机,最高时速55英里
查看>>
Netweaver和CloudFoundry里的trace开关
查看>>
工作负载不要全部放在公共云的篮子中!
查看>>
tf.Graph().get_operations
查看>>
【工业串口和网络软件通讯平台(SuperIO)教程】一.通讯机制
查看>>