小樂樂匹配字串(動態規劃)
阿新 • • 發佈:2018-12-16
連結: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
版權宣告:本文為博主原創文章,轉載請附上博文連結!