编辑距离

题面

给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

插入一个字符
删除一个字符
替换一个字符

输入: word1 = "horse", word2 = "ros"
输出: 3
解释:
horse -> rorse (将 'h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

思路:

f[i][j]第一个单词的前i个字母,第二个单词的前j个字母匹配的最小操作数

f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);//更改
f[i][j] = min(f[i][j], f[i - 1][j] + 1);//添加
f[i][j] = min(f[i][j], f[i][j - 1] + 1);
f[i][j] = min(f[i][j], f[i][j - 1] + 1);//删除
//删除第一个单词的字母,与在第二个单词添加一个单词等价

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 const int N=1000;
 4 char w1[N],w2[N];
 5 int l1,l2,f[N][N];
 6 int main() {
 7     scanf("%d", &w1);
 8     scanf("%d", &w2);
 9     l1 = strlen(w1);
10     l2 = strlen(w2);
11     memset(f, 0x3f3f3f3f, sizeof(f));
12     f[0][0] = 0;
13     for (int i = 0; i <= l1; i++) {
14         f[i][0] = i;
15     }
16     for (int i = 0; i <= l2; i++) {
17         f[0][i] = i;
18     }
19     for (int i = 1; i <= l1; i++) {
20         for (int j = 1; j <= l2; j++) {
21             if (w1[i] == w2[j]) f[i][j] = f[i - 1][j - 1];
22             else {
23                 f[i][j] = min(f[i][j], f[i - 1][j - 1] + 1);//更改
24                 f[i][j] = min(f[i][j], f[i - 1][j] + 1);//添加
25                 f[i][j] = min(f[i][j], f[i][j - 1] + 1);
26                 f[i][j] = min(f[i][j], f[i][j - 1] + 1);//删除
27                 //删除第一个单词的字母,与在第二个人单词添加一个单词等价
28             }
29         }
30     }
31     printf("%d
", f[l1][l2]);
32 }
View Code
原文地址:https://www.cnblogs.com/Accpted/p/11185903.html