现在的位置: 首页 > 综合 > 正文

2039 LCS

2012年12月12日 ⁄ 综合 ⁄ 共 1012字 ⁄ 字号 评论关闭
描述

最长公共子串(Longest common substring, 简称LCS)问题指的是求出给定的一组
字符串的长度最大的共有的子字符串。
举例说明,以下三个字符串的LCS就是 cde:
abcde
cdef
ccde

现在的情况是给你2个字符串,请找到他们的LCS

请注意:字符可以不相邻;

输入

输入第一行包含一个整数T,表示有T组数据;

对于每组数据包含2行,每行包含一个非空字符串,长度不超过1000个字符

输出

对于每组数据输出他们的LCS的长度.

样例输入
abcde 
cdef 
aaaaaaa 
aaabaaa
样例输出
6

LCS经典问题
#include<iostream>   
#include<string>  
#include<string.h> 
using   namespace   std;   
const   int   n=1002;   
int   c[n][n];   
char   str[n];   
int   lcs_len(string   a,string   b,int   c[][n])   
{   
	int   sa=a.length();   
	int   sb=b.length();   
	int   i,j;   
	for(i=0;i<=sa;++i)c[i][0]=0;   
	for(j=0;j<=sb;++j)c[0][j]=0;   
	for(i=1;i<=sa;++i)   
	{   
		for(j=1;j<=sb;++j)   
		{   
			if(a[i-1]==b[j-1])c[i][j]=c[i-1][j-1]+1;   
			else   if(c[i][j-1]>c[i-1][j])c[i][j]=c[i][j-1];   
			else   c[i][j]=c[i-1][j];   
		}   
	}   
	return   c[sa][sb];   
}   
char*bulid_lcs(char   str[],string   a,string   b)   
{   
	int   k,i=a.length(),j=b.length();   
	k=lcs_len(a,b,c);   
	str[k]='\0';   
	while(k>0)   
	{   
		if(c[i][j]==c[i-1][j])i--;   
		else   if(c[i][j]==c[i][j-1])j--;   
		else   
		{   
			str[--k]=a[i-1];   
			i--;j--;   
		}   
	}   
	return   str;   
}   
int   main()   
{  int number,te;
	string   a,b;
    cin>>number;
	for(te=1;te<=number;te++)
	{

	
	cin>>a;    
	cin>>b;   
	cout<<strlen(bulid_lcs(str,a,b))<<endl;
	}
	return   0;   
}   

抱歉!评论已关闭.