最长公共子序列和最长公共子序列

最长公共子序列:

例如:abcfbc

abfcb                答案是:4;

最长公共子串  :答案是: 2;

代码:

最长公共子序列:

#include<cstdio>
#include<cstring>
#define max(x,y) (x>y?x:y)

int len1,len2;
int dp[1010][1010];
int bj[1010][1010];
char ch1[1010],ch2[1010];

void LCS()   //lcs最长公共子序列模板
{
	int i,j;
	for(i=1;i<=len1;++i)
	{
		for(j=1;j<=len2;++j)
		{
			if(ch1[i-1]==ch2[j-1])
			{
				dp[i][j]=dp[i-1][j-1]+1;
				bj[i][j]=1;
			}
			else if(dp[i-1][j]>=dp[i][j-1])
			{
				dp[i][j]=dp[i-1][j];
				bj[i][j]=0;
			}
			else
			{
				dp[i][j]=dp[i][j-1];
				bj[i][j]=2;
			}
		}
	}
}

void PRINTF(int i,int j)  //输出最长公共子序列
{
	if(i==0||j==0)
		return ;
	if(bj[i][j]==1)
	{
		PRINTF(i-1,j-1);
		printf("%c",ch1[i-1]);
	}
	else if(bj[i][i]==0)
		PRINTF(i-1,j);
	else
		PRINTF(i,j-1);
}

int main()
{
	int len;
	while(scanf("%s%s",ch1,ch2)!=EOF)
	{
		memset(dp,0,sizeof(dp));  //清零
		memset(bj,0,sizeof(bj));

		len1=strlen(ch1);
		len2=strlen(ch2);

		LCS();

		len=dp[len1][len2];  //最长公共子序列的长度
		printf("%d\n",len);

		PRINTF(len1,len2);  //输出最长公共子序列
		printf("\n");
	}
	return 0;
}

最长公共子串:

代码:

//找出两个字符串的最长公共连续子串的长度

#include<cstdio>
#include<cstring>

char ch1[1010],ch2[1010];
char ch[1010];  //存放最大连续子串
int bj[1010][1010];
int len1,len2,max_len,xi,yj;

void LCS_string()  //最大连续子串长度
{
	int i,j;
	max_len = -1;
	for(i=1;i<len1+1;i++)
	{
		for(j=1;j<len2+1;j++)
		{
			if(ch1[i-1]==ch2[j-1])
				bj[i][j]=bj[i-1][j-1]+1;
			else
				bj[i][j]=0;

			if(bj[i][j]>max_len)
			{
				max_len=bj[i][j];
				xi=i;
				yj=j;
			}
		}
	}
}

void MAX_string()  //求最大连续子串
{
	int n=max_len;
	int i,j;
	ch[n--]='\0';
	i=xi-1;
	j=yj-1;
	while(i>=0&&j>=0)
	{
		if(ch1[i]==ch2[j])
		{
			ch[n--]=ch1[i];
			i--;
			j--;
		}
		else
			break;
	}
}

int main()
{
	while(scanf("%s%s",ch1,ch2)!=EOF)
	{
		len1=strlen(ch1);
		len2=strlen(ch2);
		memset(ch,'\0',sizeof(ch));
		memset(bj,0,sizeof(bj));

		LCS_string();

		printf("最大连续子串长度:     %d\n",max_len);

		MAX_string();

		printf("最大连续子串:         %s\n",ch);
	}
	return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-11-06 07:35:22

最长公共子序列和最长公共子序列的相关文章

最长公共子序列|最长公共子串|最长重复子串|最长不重复子串|最长回文子串|最长递增子序列|最大子数组和

参考:http://www.ahathinking.com/archives/124.html 最长公共子序列 1.动态规划解决过程 1)描述一个最长公共子序列 如果序列比较短,可以采用蛮力法枚举出X的所有子序列,然后检查是否是Y的子序列,并记录所发现的最长子序列.如果序列比较长,这种方法需要指数级时间,不切实际. LCS的最优子结构定理:设X={x1,x2,……,xm}和Y={y1,y2,……,yn}为两个序列,并设Z={z1.z2.……,zk}为X和Y的任意一个LCS,则: (1)如果xm=

最长递增子序列 &amp;&amp; 最大子序列、最长递增子序列、最长公共子串、最长公共子序列、字符串编辑距离

http://www.cppblog.com/mysileng/archive/2012/11/30/195841.html 最长递增子序列问题:在一列数中寻找一些数,这些数满足:任意两个数a[i]和a[j],若i<j,必有a[i]<a[j],这样最长的子序列称为最长递增子序列. 设dp[i]表示以i为结尾的最长递增子序列的长度,则状态转移方程为: dp[i] = max{dp[j]+1}, 1<=j<i,a[j]<a[i]. 这样简单的复杂度为O(n^2),其实还有更好的方

最长公共子串和最长公共子序列

最长公共子串与最长公共子序列是有区别的.区别在于最长公共子串要求字符是连续的. 例如:str1:  abcd      str2:  abec那么最长公共子序列是:abc,长度为3最长公共子串是:ab,长度为2 1. 最长公共子序列 Largest common subsequence 最长公共子序列:用f[i][j]表示str1的前i个字符与str2的前j个字符的最长公共子序列的长度. int LCS(int a[],int b[],int len) { vector<int> f(len+

最长公共子序列和最长递增子序列

1.最长公共子序列:(x和y是两个数组的长度) f(x,y) = 0                               if(x==0 || y==0) f(x-1,y-1)+1               if(A[x-1]==B[y-1]) max{f(x-1,y), f(x,y-1)} if(A[x-1]!=B[y-1]) 2.最长递增子序列 (1) 最长公共子序列法:排序后与原数组的最长公共子序列. (2) 动态规划法:(时间复杂度O(N^2)) 设长度为N的数组为{a0,a1

最长【递增】子序列:注意没有公共,即只有一个序列。

monotonic:单调的. 序列为X=(x1,x2,x3,x4...),首先排序X得到X',找出X和X'的最长公共子序列(LCS)即可. 另一种思维: 先回顾经典的O(n^2)的动态规划算法,设A[i]表示序列中的第i个数,F[i]表示从1到i这一段中以i结尾的最长上升子序列的长度,初始时设F[i] = 0 :(i = 1, 2, ..., len(A)).则有动态规划方程:F[i] = max{1, F[j] + 1} (j = 1, 2, ..., i - 1, 且A[j] < A[i])

最长公共子串、最长公共子序列的Java实现与NLP应用

前言以前HanLP使用"最短编辑距离"来做推荐器,效果有待提高,主要缺点是根据拼音序列的编辑距离推荐的时候,同音字交错很常见,而编辑距离却不那么大.这时我就在寻求一种补充的评分算法,去评判两个句子在拼音这一维度上的相似程度.区别最长公共子串(Longest Common Substring)指的是两个字符串中的最长公共子串,要求子串一定连续.最长公共子序列(Longest Common Substring)指的是两个字符串中的最长公共子串,不要求子串连续.求解两者的求解与编辑距离一样,

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

出处 http://segmentfault.com/blog/exploring/ 本章讲解:1. LCS(最长公共子序列)O(n^2)的时间复杂度,O(n^2)的空间复杂度:2. 与之类似但不同的最长公共子串方法.最长公共子串用动态规划可实现O(n^2)的时间复杂度,O(n^2)的空间复杂度:还可以进一步优化,用后缀数组的方法优化成线性时间O(nlogn):空间也可以用其他方法优化成线性.3.LIS(最长递增序列)DP方法可实现O(n^2)的时间复杂度,进一步优化最佳可达到O(nlogn)

最长公共子序列与最长公共字串

显然最长公共子序列不一定需要连续的,只要字符的顺序严格递增即可.最长公共字串需要字符连续 子序列代码: package test; import java.util.*; /* * 本题是求最长公共子序列,子序列未必连续,只需要严格递增即可 * 如 abcdeeeeeeeee和atttbggcd 最长公共子序列为abcd 长度为4 * * */ public class Main4{ public static void main(String... args){ try(Scanner in

最长连续公共子串、最长公共子串(可以非连续)、最长回文串(连续)、最长回文串(可以不连续)、最长递增数组的求解

问题:最长连续公共子串.最长公共子串(可以非连续).最长回文串(连续).最长回文串(可以不连续).最长递增数组.长方形镶嵌最多的求解 方法:上述问题有相似性,都可以采用动态规划进行求解. (1)最长连续公共子串: 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=0; (2)最长公共子串(可非连续): 如果A[i]==B[j], dp[i][j]=dp[i-1][j-1]+1; 否则,dp[i][j]=dp[i-1][j-1]; (3)最长回文

[经典] 最X(长 | 大和 | 大积)Y(子序列 | 子字符串)

Note: 子序列,可以不连续:子字符串,必须连续. 以下题目按在我看看来的难度从易到难排列: 最大和子序列(Maximum sum subsequence) 这道题纯属娱乐...应该不会有人出这种题吧.方案是遇到正数就放入序列. vector<int> msseq(vector<int> &num) { vector<int> result; for(int i : num) if(i > 0) result.push_back(i); return r