题面
给定两个单词 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 }