上文链接:https://blog.csdn.net/slient_love/article/details/104310092
最长连续公共子序列LCS
题目描述
输入两个字符串s1,s2,设s1长度为a,s2长度为b,s1与s2的最长公共子串长度为c,定义公共因子 d=c/(a+b),要求求得d并输出,结果保留两位小数。
输入描述:
输入两个字符串s1,s2,长度不大于100,以空格隔开
输出描述:
输出公共因子d,结果保留两位小数
示例:
输入:
abcdef acbdefh
输出:
0.23
两字符串具有连续公共子序列def,c=3,a=6, b=7, 于是有d=c/(a+b)=3/13=0.23
做题思路:
解决此类公共子序列典型解题方法就是使用动态规划。
代码展示:
#define MAX 101
#include<iostream>
#include<iomanip>
#include<string.h>
using namespace std;
int dp[MAX][MAX];
int main()
{
char str1[MAX];
char str2[MAX];
cin>>str1>>str2;
int a=strlen(str1);
int b=strlen(str2);
int max_len=0; // 最大长度
// 初始化序列
for(int i=0;i<=a;i++)
dp[i][0]=0;
for(int j=0;j<=b;j++)
dp[0][j]=0;
// 递推动态规划
for(int i=1;i<=a;i++)
for(int j=1;j<=b;j++)
{
if(str1[i-1]==str2[j-1])
{
dp[i][j]=dp[i-1][j-1]+1;
// 更新最大长度
if(dp[i][j]>max_len)
max_len=dp[i][j];
}
else
dp[i][j]=0;
}
int c=max_len;
float ans=(float)c/(a+b);
//规格化输出
cout<<c<<endl;
cout<<setprecision(2)<<ans<<endl;
return 0;
}
参考链接:
https://blog.csdn.net/qq_15034457/article/details/79759810
来源:CSDN
作者:slient_love
链接:https://blog.csdn.net/slient_love/article/details/104311852