/************************************************************************/
/* lcs test */
/* 2011-2-9 */
/************************************************************************/
#include <iostream>
#include <vector>
#include <string>
using namespace std;
string lcs_1_array2(string a, string b)
{
if(a == "" || b == "")
return "";
int lenA = a.length();
int lenB = b.length();
int shortLen = min(lenA, lenB);
int longLen = max(lenA, lenB);
string& longStr = lenA > lenB ? a:b;
string& shortStr = lenA > lenB ? b:a;
int*arr = new int[shortLen];
memset(arr, 0, sizeof(int)*shortLen);
int maxPos = 0;
int maxMatchLen = 0;
int lastVal = 0;
int oldVal = 0;
for(int i = 0; i < longLen; i++)
for(int j = 0; j < shortLen; j++)
{
oldVal = arr[j];
if(longStr[i] == shortStr[j])
{
if(j > 0)
arr[j] = lastVal + 1;
else
arr[j] = 1;
if(arr[j] > maxMatchLen)
{
maxMatchLen = arr[j];
maxPos = j;
}
}
else
{
arr[j] = 0;
}
lastVal = oldVal;
}
if(maxMatchLen == 0)
return "";
cout<<maxPos<<" "<<maxMatchLen<<endl;
return shortStr.substr(maxPos + 1 - maxMatchLen, maxMatchLen);
}
string lcs_2_array(string a, string b)
{
if(a == "" || b == "")
return "";
int lenA = a.length();
int lenB = b.length();
int shortLen = min(lenA, lenB);
int longLen = max(lenA, lenB);
string& longStr = lenA > lenB ? a:b;
string& shortStr = lenA > lenB ? b:a;
int**arr = new int*[2];
arr[0] = new int[shortLen];
arr[1] = new int[shortLen];
memset(arr[0], 0, sizeof(int)*shortLen);
memset(arr[1], 0, sizeof(int)*shortLen);
int maxPos = 0;
int maxMatchLen = 0;
for(int i = 0; i < longLen; i++)
for(int j = 0; j < shortLen; j++)
{
if(longStr[i] == shortStr[j])
{
if(i > 0 && j > 0)
arr[i%2][j] = arr[(i+1)%2][j-1] + 1;
else
arr[i%2][j] = 1;
if(arr[i%2][j] > maxMatchLen)
{
maxMatchLen = arr[i%2][j];
maxPos = j;
}
}
else
{
arr[i%2][j] = 0;
}
}
if(maxMatchLen == 0)
return "";
cout<<maxPos<<" "<<maxMatchLen<<endl;
return shortStr.substr(maxPos + 1 - maxMatchLen, maxMatchLen);
}
int main()
{
string a, b;
a = "312";
b = "31233";
cout<<"Test of 1 array"<<endl;
cout<<lcs_1_array2(a, b)<<endl;
cout<<"========================================="<<endl;
cout<<"Test of 2 array"<<endl;
cout<<lcs_2_array(a, b)<<endl;
system("pause");
return 0 ;
}
分享到:
相关推荐
当然,为了调试和查看输出,我们可能还需要一些辅助的开发工具,如集成开发环境(IDE)或者命令行工具。 总的来说,这个"LCS.rar"压缩包包含了一个基于LCS算法的Java程序,用于合并两个文件,保留它们的共同部分,...
根据LCS算法取出最长公用字符串,实现字符串比较
最长子序列LCS算法,用于处理最长公共字串问题。 两个序列的LCS问题包含两个序列的前缀的LCS,因此,LCS问题具有最优子结构性质。在设计递归算法时,不难看出递归算法具有子问题重叠的性质。 设C[i,j]C[i,j]...
"LCS服务器部署安装指南" LCS(Live Communications Server)是一种实时通信服务器软件,用于提供即时消息、 Presence、Audio/Video 会议等功能。在部署 LCS 服务器之前,需要完成相关的环境配置和安装准备工作。...
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一种经典的问题,主要涉及到了动态规划这一算法设计思想。在这个问题中,给定两个字符串,目标是找到它们的最长子序列,这个子序列不必连续,...
**最长公共子序列(Longest Common Subsequence, LCS)** 最长公共子序列问题是一个经典的计算机科学问题,主要涉及字符串或序列的比较。在两个给定的字符串中,LCS是指无需考虑字符顺序的最长子串,它同时存在于这...
标题中的"LCS.rar_LCS_lcs dynamic"表明这是一个关于最长公共子序列(Longest Common Subsequence, LCS)问题的资源包,重点在于动态规划的实现。动态规划是一种解决复杂问题的有效算法,通常用于找到最优化的解决...
而www.pudn.com.txt可能是用来测试程序的输入文件,包含了一些字符串数据用于计算LCS。 通过阅读和理解LCS.CPP的源代码,我们可以深入学习动态规划的思想,理解如何将这个算法应用于实际问题中。同时,这也可以作为...
最长公共子序列(Longest Common Subsequence,LCS)算法是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在文本编辑、生物信息学、数据挖掘等领域有着广泛的应用。LCS问题的基本目标是...
标题中的“lcs.rar_LCS”表明这是一个关于“最长公共子序列(Longest Common Subsequence, LCS)”问题的压缩文件。LCS是计算机科学中一个经典的算法问题,主要涉及字符串处理、序列比较和动态规划等领域。在这个...
最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的计算机科学问题,主要应用于比较和分析两个或多个序列的相似性。在本场景中,我们关注的是使用C#编程语言来实现这一算法。C#是Microsoft开发的一...
《C#实现LCS文本比较器详解》 在软件开发中,文本比较是常见的需求,尤其是在版本控制、文档差异分析等方面。本项目“C# LCS 文本比较器”基于最长公共子序列(Longest Common Subsequence,简称LCS)算法,提供了...
最长公共子序列(Longest Common Subsequence,简称LCS)是计算机科学中一个经典的问题,特别是在生物信息学、文本处理和软件工程等领域有着广泛应用。LCS问题的基本目标是从两个或多个给定的序列中找到一个最长的子...
**最长公共子序列(LCS, Longest Common Subsequence)算法是计算机科学中一种经典的字符串比较算法,主要用于找出两个序列的最长子序列,这个子序列并不需要在原序列中是连续的。在本项目中,LCS算法被实现为连续...
一个子序列是从原序列中删除一些或不删除任何元素,但保持原有顺序形成的序列。LCS不关心子序列在原序列中的起始位置,只关注它们的元素是否相同。 动态规划解决方案通常使用一个二维数组L[X.length+1][Y.length+1]...
最长公共子序列(Longest Common Subsequence,简称LCS)是一种经典的计算机科学问题,主要应用于比较和分析序列,如文本、DNA序列或编程语言源代码。LCS算法旨在找到两个给定序列之间的最长子序列,这个子序列并不...