04 公共子序列
给两个字符串,求两个字符串的最长的公共子字符串。
用dp【i】【j】表示s的第 i个字符与ss的第 j个字符的子序列长度,要注意s,ss是从【0】开始的,所以dp【i】【j】实际上是s【i-1】与ss【j-1】的结果。
公式:当s【i-1】==ss【j-1】时, dp【i】【j】=dp【i-1】【j-1】+1;
不等于时,dp【i】【j】=max{dp【i】【j-1】,dp【i-1】【j】}。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int main()
{
char s[250],ss[250];
while(cin>>s>>ss)
{
int dp[250][250];
int i,j,l,ll;
l=strlen(s);
ll=strlen(ss);
for(i=0;i<l;i++)
dp[i][0]=0;
for(j=0;j<ll;j++)
dp[0][j]=0;
for(i=1;i<=l;i++)
for(j=1;j<=ll;j++)
{
if(s[i-1]==ss[j-1])
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=max(dp[i][j-1],dp[i-1][j]);
}
cout<<dp[l][ll]<<endl;
}
return 0;
}