比如输入
abcfbc abfcab
programming contest
adfgs jyt
输出
4
2
0
思路:采用动态规划,一般是先确定动态的状态数组,然后找边界的条件,一般边界都是可以求出来的,
然后再找不是边界的和边界之间的关系
#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int maxlen[100][100];//定义一个存放状态的数组
char a[100],b[100];
int main()
{
cin>>a>>b;
int len1=strlen(a);
int len2=strlen(b);
for(int i=1;i<=len1;i++)
{
maxlen[i][0]=0;//如果第二个字符串没有,就是0
}
for(int j=1;j<=len2;j++)
{
maxlen[0][j]=0;//如果第一个字符串没有,就是0
}
//先找边界条件
for(int i=1;i<=len1;i++)
{
for(int j=1;j<=len2;j++)
{
if(a[i-1]==b[j-1])//如果向前找到有相同的字符,那么一定符合前i-1,j-1的情况加1
//这样就找到了类似递归的公式
{
maxlen[i][j]=maxlen[i-1][j-1]+1;
}
else//如果找不到相同的就是当前的一定不会都大于这两个,也一定不会比任何一个都小
//这个关系是是本题的关键
maxlen[i][j]=max(maxlen[i-1][j],maxlen[i][j-1]);
}
}
cout<<maxlen[len1][len2];
return 0;
}