1. 程式人生 > >小樂樂匹配字串(動態規劃)

小樂樂匹配字串(動態規劃)

連結: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 
版權宣告:本文為博主原創文章,轉載請附上博文連結!