我有一个程序可以计算两个字符串的编辑距离。它还输出所有编辑操作以获得完整的转换。 我写了一个递归函数,探索由编辑距离计算函数填充的矩阵并重建路径
void reconstruct_path(char *s1, char *s2 int i, int j , matrix_t matrix)
{
if(matrix[i][j].parent == -1) return;
if (matrix[i][j].parent == MATCH)
{
reconstruct_path(s1,s2,i-1,j-1,matrix);
match_out(s1, s2 , i, j);
return;
}
if (matrix[i][j].parent == INSERT)
{
reconstruct_path(s1,s2,i,j-1,matrix);
insert_out(s2, j);
return;
}
if (matrix[i][j].parent == DELETE)
{
reconstruct_path(s1,s2,edit,i-1,j,matrix);
delete_out(s1, i);
return;
}
}`
你可以注意到这个函数调用了三个函数
- void match_out(char *s1, char *s2,int i, int j)
- void insert_out(char *t, int j)
- void delete_out(char *s, int i)
void match_out(char *s1, char *s2 ,int i, int j)
{
if (s1[i] == s2[j])
{
printf("M no edit needed \n" );
}
else
{
printf("S subst %c with %c \n",s1[i] , s2[j]);
}
}
void insert_out(char *t, int j)
{
printf("I Insert %c\n",t[j]);
}
void delete_out(char *s, int i)
{
printf("D delete %c\n",s[i]);
}
这会产生这样的输出
从“父母”到“堂兄”:
S sub p with c
S sub a with o
S sub r with u
用s
表示 S sub n with i
S取代n
我想改进这一点以获得更精确的输出:
从“父母”到“堂兄”:
具有c父母的S pp - >看护人 S sub a with carent - > corent
S core r with u corent - > couent
具有优先权的S - 具体 - > cousnt S sub n with i cousnt - > cousit
s取代n cousit - >表妹
你有什么建议吗? (我对C字符串操作不太好)
[从评论更新为this answer:]
s1
和s2
收到的两个字符串的数据类型是什么? (由vj1207提问)
它们在main()
中声明为char *str_a = " parent"; char *str_b = " cousin";
答案 0 :(得分:2)
您可以在 match_out
中添加几行void match_out(char *s1, char *s2, char **edit ,int i, int j)
{
if (s1[i] == s2[j])
{
printf("M no edit needed \n" );
}
else
{
printf("S subst %c with %c ",s1[i] , s2[j]);
//**from here**
printf("%s -> ",s1);
s1[i]=s2[j];
printf("%s\n",s1);
//upto here
}
}
更新
您可以将char数组声明为
char str[]= {'p','a','r','e','n','t'};
如果您将其声明为
char * str = "parent";
然后你无法修改它。这就是你得到上述错误的原因。