加密字符串相似度计算

算法描述

【问题描述】
现有4个加密的字符串(中间不含空格),需要分析研究它们的相似度,两个字符串的相似度用其最长公共子系列的长度表示,例如,字符串“ABDECFG”和字符串“ADCGEFA”的一个最长公共子序列为 “ADEF”,所以这两个字符串的相似度为4。现在需要对输入的4个字符串,分别计算它们的相似度,找出相似度最高的一对字符串,若存在多对相似度最高的字符串,应全部输出。
【输入】 分4行输入4个字符串。
【输出】 按行依次输出相似度最高的一对字符串、它们的相似度、对应的最长公共子序列,若有多组最高相似度相同,应全部输出。
【输入样例】
ABDECFEB
ADCEBGH
ADCFEB
BECEBFBD
【输出样例】
ABDECFEB ADCFEB 6 ADCFEB

输出样例说明:以上4个字符串,共可以构成6组,依次计算它们的相似度如果,因此,相似度最高的是字符串ABDECFEB和ADCFEB,相似度为6,对应的一个最长公共子序列为ADCFEB。
ABDECFEB ADCEBGH 5 ADCEB
ABDECFEB ADCFEB 6 ADCFEB
ABDECFEB BECEBFBD 5 BECFB
ADCEBGH ADCFEB 5 ADCEB
ADCEBGH BECEBFBD 3 CEB
ADCFEB BECEBFBD 3 CFB

C语言实现

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
/*
动态规划算法加递归
时间复杂度为n方
*/
#include<stdio.h>
#include<string.h>
#define MAXLEN 100

char s[MAXLEN][MAXLEN];
int len[MAXLEN],b[MAXLEN][MAXLEN],c[MAXLEN][MAXLEN];

void LCSLength(char *x, char *y, int m, int n, int c[][MAXLEN], int b[][MAXLEN])
{
int i, j;
for (i=0; i<=m;i++) c[i][0]=0;
for (j=1; j<=n;j++) c[0][j]=0;
for (i=1;i<=m;i++)
for (j=1;j<=n;j++)
{if (x[i-1]==y[j-1])
{c[i][j]=c[i-1][j-1]+1;
b[i][j]=0;
}
else if(c[i-1][j]>=c[i][j-1])
{c[i][j]=c[i-1][j];
b[i][j]=1;
}
else
{c[i][j]=c[i][j-1];
b[i][j]=-1;
}
}
}
void PrintLCS(int b[][MAXLEN], char *x, int i, int j)
{
if (i==0||j==0)
return;
if (b[i][j]==0)
{
PrintLCS(b,x,i-1,j-1);
printf("%c",x[i-1]);
}
else if(b[i][j]==1)
PrintLCS(b,x,i-1,j);
else
PrintLCS(b,x,i,j-1);
}

int main()
{
printf("输入:\n");
for(int i=0;i<4;i++) scanf("%s",&s[i]); //为字符串数组s[]赋初值
for(i=0;i<4;i++) len[i]=strlen(s[i]);
int maxn=c[len[0]][len[0]]; //c是记录最长公共子序列长度的数组
for(i=0;i<4;i++)
for(int j=i+1;j<4;j++)
{
LCSLength(s[i],s[j],len[i], len[j], c, b);
maxn=(maxn>c[len[i]][len[j]])?maxn:c[len[i]][len[j]];//获取公共位数最大值
}
printf("输出:");

for(i=0;i<4;i++)
for(int j=i+1;j<4;j++)
{
LCSLength(s[i], s[j],len[i], len[j], c, b);
if(maxn==c[len[i]][len[j]])
{
printf("%s ",s[i]);
printf("%s ",s[j]);
printf("%d ", c[len[i]][len[j]]);//打印公共位数
PrintLCS(b, s[i], len[i], len[j]);//打印子序列
printf("\n");
}
}
return 0;
}

运行截图

运行截图