最长公共子序列:
题目:
给定两个字符串,求解这两个字符串的最长公共子序列
比如字符串1:BDCABA;字符串2:ABCBDAB
则这两个字符串的最长公共子序列长度为4,最长公共子序列:BCBA
解析:
子序列不用连在一起
所以它可以跳着选择
假设DP[n][m](n是字符串1的长度,m是字符串2的长度)
那如果a[n]==a[m]
那DP[n][m]=dp[n-1][m-1]+1
否则的话
就选择DP[n][m-1],D[n-1][m]
中的最大值
下面上代码:
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
int dp[1001][1001];
char a[1001],b[1001];
int main()
{
gets(a);
gets(b);
memset(dp,0,sizeof(dp));
int lena1=strlen(a);
int lenb1=strlen(b);
for(int i=1;i<=lena1;i++)
for(int j=1;j<=lenb1;j++)
{
if(a[i-1]==b[j-1]) dp[i][j]=dp[i-1][j-1]+1;
else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
}
cout<<dp[lena1][lenb1];
return 0;
}
最长公共子串
题目:
给定两个字符串A和B,长度分别为m和n,要求找出它们最长的公共子串,并返回其长度。例如:
A = “HelloWorld”、 B = “loop”
则A与B的最长公共子串为 “lo”,返回的长度为2。
我们可以看到子序列和子串的区别:
子序列和子串都是字符集合的子集,但是子序列不一定连续,但是子串一定是连续的。
解析:
子串比子序列更简单
只有选和不选
并且不断更新最大值就可以了
下面是代码
代码:
#include<bits/stdc++.h>
#include<iostream>
#include<cstdlib>
#include<cstdio>
using namespace std;
char a[1001],b[1001];
int dp[1001][1001],sum=0;
int main()
{
freopen("zcggzc.in","r",stdin);
freopen("zcggzc.out","w",stdout);
memset(dp,0,sizeof(dp));
gets(a);
gets(b);
int lena1=strlen(a);
int lenb1=strlen(b);
for(int i=1;i<=lena1;i++)
for(int j=1;j<=lenb1;j++)
{
if(a[i-1]==b[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
if(dp[i][j]>sum) sum=dp[i][j];
}
}
cout<<sum<<endl;
fclose(stdin);
fclose(stdout);
return 0;
}