源代码:
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
char s1[MAXSIZE],s2[MAXSIZE];
int editDistance(int len1,int len2);//求编辑距离
int min(int a,int b,int c);//求最小值的函数
int len(char * s);//求字符串的长度
int len(char * s)
{
int count = 0;
char * s1 = s;
while(*s1 ++) count++;
printf("\n当前的字符串 %s 的长度是:%d\n",s,count);
return count;
}
int editDistance(int len1,int len2)
{
int d[len1+1][len2+1];
int k,i,j;
int cost,deletion,insert,substitute;
for(j=0;j<=len1;j++) d[j][0] = j;
for(k=0;k<=len2;k++) d[0][k] = k;
printf("========================");
printf("\n当前的布局是:\n");
for(i = 0 ;i<=len1;i++)
{
for(j=0;j<=len2;j++)
{
printf("%d",d[i][j]);
printf(" ");
}
printf("\n");
}
printf("\n");
printf("========================");
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
cost = s1[i-1] == s2[j-1] ? 0:1;
printf("\n%c %c d[%d][%d]的cost是%d\n",s1[i-1],s2[j-1],i,j,cost);
deletion = d[i-1][j]+1;
insert = d[i][j-1]+1;
substitute = d[i-1][j-1]+cost;
d[i][j] = min(deletion,insert,substitute);
}
printf("========================");
printf("\n当前的布局是:\n");
for(i = 0 ;i<=len1;i++)
{
for(j=0;j<=len2;j++)
{
printf("%d",d[i][j]);
printf(" ");
}
printf("\n");
}
printf("\n");
printf("========================");
printf("最小编辑距离是%d \n",d[len1][len2]);
return d[len1][len2];
}
int min(int a,int b,int c)
{
return a<b ? a<c?a:c : b<c?b:c;
}
void test()
{
int i=0,j=0;
int a[4][4] ={2,3,5,6,1,3,3};
printf("Hello\n");
for(i=0;i<4;i++)
{
for(j=0;j<4;j++)
{
printf("%d",a[i][j]);
printf(" ");
}
printf("\n");
}
}
int main()
{
// printf("Hello %d \n",len("hellosssss"));
scanf("%s %s",s1,s2);
editDistance(len(s1),len(s2));
//test();
return 0;
}
测试的结果:
加上文件读写的代码段:
#include<stdio.h>
#include<malloc.h>
#define MAXSIZE 100
char s1[MAXSIZE],s2[MAXSIZE];
FILE *fpin,*fpout;
int editDistance(int len1,int len2);//求编辑距离
int min(int a,int b,int c);//求最小值的函数
int len(char * s);//求字符串的长度
int len(char * s)
{
int count = 0;
char * s1 = s;
while(*s1 ++) count++;
printf("\n当前的字符串 %s 的长度是:%d\n",s,count);
return count;
}
int editDistance(int len1,int len2)
{
int d[len1+1][len2+1];
int k,i,j;
int cost,deletion,insert,substitute;
for(j=0;j<=len1;j++) d[j][0] = j;
for(k=0;k<=len2;k++) d[0][k] = k;
printf("========================\n");
for(i=1;i<=len1;i++)
for(j=1;j<=len2;j++)
{
cost = s1[i-1] == s2[j-1] ? 0:1;
printf("\n%c %c d[%d][%d]的cost是%d\n",s1[i-1],s2[j-1],i,j,cost);
deletion = d[i-1][j]+1;
insert = d[i][j-1]+1;
substitute = d[i-1][j-1]+cost;
d[i][j] = min(deletion,insert,substitute);
}
printf("========================");
printf("\n当前的结果是:\n");
for(i = 0 ;i<=len1;i++)
{
for(j=0;j<=len2;j++)
{
printf("%d",d[i][j]);
printf(" ");
}
printf("\n");
}
printf("\n");
printf("========================\n");
printf("最小编辑距离是%d \n",d[len1][len2]);
return d[len1][len2];
}
int min(int a,int b,int c)
{
return a<b ? a<c?a:c : b<c?b:c;
}
int main()
{
//scanf("%s %s",s1,s2);
if((fpin = fopen("./input.txt","r"))==NULL)
{
printf("文件不存在,回车离开\n");
getchar();
exit(0);
}
if((fpout = fopen("./output.txt","w"))==NULL)
{
printf("文件写失败,回车离开\n");
getchar();
exit(0);
}
fscanf(fpin,"%s",s1);
printf("读取s1 %s",s1);
fscanf(fpin,"%s",s2);
printf("读取s2 %s",s2);
fprintf(fpout,"%d\n",editDistance(len(s1),len(s2)));
//test();
//关闭文件
if(fclose(fpin)!=0 || fclose(fpout)!=0)//成功关闭的文件数不是2
{
printf("关闭文件失败 \n");
}
return 0;
}