题解 | #计算字符串的编辑距离#
计算字符串的编辑距离
https://www.nowcoder.com/practice/3959837097c7413a961a135d7104c314
#include <stdio.h>
#include <string.h>
#define MIN(a,b,c) ((a)>(b)?((b)>(c)?(c):(b)):((a)>(c)?(c):(a)))
int main() {
char str1[1001], str2[1001];
while (scanf("%s %s", str1, str2) != EOF) {
int len1 = strlen(str1);
int len2 = strlen(str2);
int dp[1000+1][1000+1];
//初始状态
for(int i=0;i<len1+1;i++)
{
//str2为空,str1只有前i个字符时,需要添加i个字符,即修改i次
dp[i][0] = i;
}
for(int i=0;i<len2+1;i++) //同理
{
//str1为空,str2只有前i个字符时,需要添加i个字符,即修改i次
dp[0][i] = i;
}
for(int i=1;i<len1+1;i++) //子问题:str1只有前i个字符时的情况
{
for(int j=1;j<len2+1;j++) //用整个str2去匹配str1的第i个字符
{
if(str1[i-1] == str2[j-1]) //当前字符相等
{
//则不需要增加编辑次数 对str1和str2来说 当前字符加不加都一样
dp[i][j] = dp[i-1][j-1]; //继承上一个字符的次数即可
}else {
//需要找到str1的第i个字符对应的str2的第j个字符的最小编辑次数
//因此需要分别比较str1 和 str2上一个字符+一次编辑的最小值
dp[i][j] = MIN(dp[i-1][j-1]+1,dp[i][j-1]+1,dp[i-1][j]+1);
}
}
}
printf("%d",dp[len1][len2]);
}
return 0;
}

查看15道真题和解析