小乐乐匹配字符串(动态规划)

链接:https://ac.nowcoder.com/acm/contest/301/E
来源:牛客网
 

小乐乐匹配字符串

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

小乐乐有字符串str1,str2。

小乐乐想要给他们找朋友。

小乐乐想知道在这两个字符串中最多能匹配出多长的相同子串(可非连续)。

输入描述:

第一行输入字符串str1;

第二行输入字符串str2;

数据保证字符串长度小于1000,且非空,字符串仅由小写字母组成。

输出描述:

输出最长相同子串的长度。

示例1

输入

复制

asd
ad

输出

复制

2

前面写了矩形嵌套和01背包和硬币问题后现在来补这题,发现居然还是不会。what,什么情况,自闭。一番百度之后发现这位老兄解析的真的是好,妙懂:::https://blog.csdn.net/MallowFlower/article/details/84720324

下面四句是关键,看了之后就直接打出代码了

 s1......si和t1......tj对应的公共子列可能是:
                   1.当s(i+1)=t(i+1)时,在s1...si和t1...ti的公共子列末尾追加上s(i+1)
                   2.s1...si和t1...t(j+1)的公共子列
                   3.s1...s(i+1)和t1...tj的公共子列
--------------------- 
作者:MallowFlower 

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=1e3+10;
char s1[maxn],s2[maxn];
int dp[maxn][maxn];
int l1,l2;
int main()
{
	while(~scanf("%s%s",s1,s2))
	{
		l1=strlen(s1);
		l2=strlen(s2);
		memset(dp,0,sizeof(dp));//dp[i][j]代表的就是字符s1[i]之前和 s2[j]之前的最长子序列那么 
		for(int i=0;i<l1;i++)
		for(int j=0;j<l2;j++)
		{
			if(s1[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1;//若 s1[i]==s2[j], dp[i+1][j+1]就是dp[i][j]的再加一
			else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);//s1[i]!=s2[j], dp[i+1][j+1]就是s1[i+1]之前与s2[j]之前最长的
			//公共子序列,也就是 dp[i+1][j]。或者是 dp[i+1][j+1]就是s1[i]之前与s2[j+1]之前最长的
			//公共子序列,也就是dp[i][j+1]. 
		}
		printf("%d\n",dp[l1][l2]);
	}
}


来源:CSDN 
原文:https://blog.csdn.net/MallowFlower/article/details/84720324 
版权声明:本文为博主原创文章,转载请附上博文链接!

猜你喜欢

转载自blog.csdn.net/qq_41286356/article/details/84774439