51 nod 1006 公共串(Lcs)

给出两个字符串A B,求A与B的最长公共子序列(子序列不要求是连续的)。
比如两个串为:

abcicba
abdkscab

ab是两个串的子序列,abc也是,abca也是,其中abca是这两个字符串最长的子序列。
Input第1行:字符串A 
第2行:字符串B 
(A,B的长度 <= 1000)Output输出最长的子序列,如果有多个,随意输出1个。Sample Input
abcicba
abdkscab
Sample Output
abca

思路:自己看了"牛神"的代码,一瘸一拐的勉强写下来了,不容易。AC代码如下:

#include<iostream>
#include<string.h>
#include<algorithm>
using namespace std;
int dp[1001][1001];
int main()
{
	int i,j;
	char s1[1001],s2[1001],s3[1001];
	cin>>s1>>s2;
	int k=strlen(s1);
	int l=strlen(s2);
	memset(dp,0,sizeof(dp));
	for(i=0;i<k;i++)
	  for(j=0;j<l;j++)
	  {
	     if(s1[i]==s2[j])
	        dp[i+1][j+1]=dp[i][j]+1;
	     else
	        dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);
			}
	int len=dp[k][l];
	memset(s3,'\0',sizeof(s3));
	for(;dp[k][l]!='\0';)
	{
		if(dp[k][l]==dp[k-1][l])
		   k--;
		else if(dp[k][l]==dp[k][l-1])
		   l--;
		else
		{
		   s3[--len]=s2[l-1];
		   k--;
		   l--;
		   }
	}
	cout<<s3<<endl;
	return 0;
}

猜你喜欢

转载自blog.csdn.net/lookqaq/article/details/80522481
今日推荐