题意就不在赘述
方法其实就是最长公共子序列模板求解
代码
:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<string>
#include<cstring>
using namespace std;
int dp[1000][1000];//dp[i][j]表示第一个串的第i个字符和第二个串的第j个字符的最长公共子序列长度;
void ini()
{
memset(dp,0,sizeof(dp));
}
int main()
{
string s,s2;
while(cin>>s>>s2)
{
ini();
for(int i=0;i<s.size();i++)//模板开始
{
for(int j=0;j<s2.size();j++)//这里使用了i+1,j+1,是为了避免数组下标为负数,导致RE;
{
if(s[i]==s2[j]) dp[i+1][j+1]=dp[i][j]+1;//如果在i,j时两个字符相等,那么他的状态一定是i-1,j-1,个字符传来的
else dp[i+1][j+1]=max(dp[i+1][j],dp[i][j+1]);//如果不相等,那么则可能是第一个串的第i-1个字符向后移一位得到,或者第二个串的第j-1个字符向后移一位;
}
}//模板结束
cout<<dp[s.size()][s2.size()]<<endl;
s.clear();
s2.clear();
}
return 0;
}