标题 字符串相似度 类别 字符串处理 时间限制 1S 内存限制 256Kb 问题描述 最长公共子串指给定的两个字符串之间最长的相同子字符串(忽略大小写),最长公共子串长度可用来定义字符串相似度。 现给出两个字符串S1和S2,S1的长度为Len1,S2的长度为Len2,假设S1和S2的最长公共子串长度为LCS,则两个字符串的相似度定义为2*LCS/(Len1+Len2)。 例如:S1=”App”,S2=”apple”,S1长度为3,S2长度为5,它们的最长公共子串为”App”,长度为3,则相似度为2*3/(3+5)=0.75。 现给出两个字符串,请计算它们的相似度结果保留3位小数。 输入说明 输入为两行,分别表示两个字符串S1和S2,每个字符串长度不超过100个字符,所有字符均为可打印字符,包括大小写字母,标点符号和空格。 输出说明 输出两个字符串的相似度,结果四舍五入保留3位小数。 输入样例 App Apple 输出样例 0.750
#include<stdio.h>
#include<string.h>
int main()
{
char s1[100]={0}, s2[100]={0};
gets_s(s1);
gets_s(s2);
float len1, len2;
len1 = strlen(s1);
len2 = strlen(s2);
if (len1 > len2)//比较长短和交换位置,让短的字符串在前
{
float temp;
temp = len1;
len1 = len2;
len2 = temp;
char sp[100];
strcpy_s(sp, s1);
strcpy_s(s1, s2);
strcpy_s(s2, sp);
}
_strlwr_s(s1);
_strlwr_s(s2);//统一大小写
char ss1[100];
strcpy_s(ss1,sizeof(s1), s1);
float a[100] ;
int t = 0;
for (int i = 0; i < len1; i++)
{
strcpy_s(s1, ss1);//需要中间值ss1,因为s1经过下面的循环已经变了
strncpy_s(s1, strlen(s1)+1, s1, strlen(s1) - i);//从后面开始删
for (int j = 0; j < (len1-i); j++)
{
char* s = strstr(s2, s1);
if (s)//直接这样就表示s!=NULL
{
a[t] = strlen(s1);//将所有相同段落的长度都记下来
t++;
break;
}
strncpy_s(s1, strlen(s1) + 1, s1 + 1, strlen(s1) - 1);//从前面开始删
}
}
for (int i = 0; i < t; i++)//这两个循环对数组a排序,最大的在第一个即a[0]
{
for (int j = i+1; j < t; j++)
{
if (a[i] < a[j])
{
float temp = a[i];
a[i] = a[j];
a[j] = temp;
}
}
}
float result = 2.000 * a[0] / (len1 + len2);//注意计算中的浮点数
printf("%.3f", result);
return 0;
}