链接: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
版权声明:本文为博主原创文章,转载请附上博文链接!