1. 题目
给你两个单词 s 和 t,请你计算出将 s 转换成 t 所使用的最少操作数。
你可以对一个单词进行如下两种操作:
- 删除一个字符
- 替换一个字符
注意:
不允许插入操作
题目保证有解
示例:
输入:s = "abcdefg", t = "abdde"
输出:3提示:
1 <= len(s), len(t) <= 200
作者:力扣 (LeetCode)
链接:https://leetcode-cn.com/leetbook/read/high-frequency-algorithm-exercise/omxcgt/
来源:力扣(LeetCode) 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
2. 解题
类似题目:LeetCode 72. 编辑距离(DP)
- 注意不能插入字符
class Solution {
public:int edit_distance(string s, string t) {int n1 = s.size(), n2 = t.size();vector<vector<int>> dp(n1+1, vector<int>(n2+1, INT_MAX));for(int i = 0; i <= n1; ++i)dp[i][0] = i;//i个s字符变成0个t字符,需要删除次数for(int i = 0; i <= n2; ++i)dp[0][i] = i;for(int i = 1; i <= n1; ++i){for(int j = 1; j <= n2; ++j){if(s[i-1] == t[j-1])dp[i][j] = dp[i-1][j-1];else{dp[i][j] = dp[i-1][j-1]+1;//替换s或t的字符if(i-1 >= j)//因为不能插入字符,删除 s 的 i 字符,前提是 s 字符串长度不能短于 t, 否则没有意义dp[i][j] = min(dp[i][j], dp[i-1][j]+1);if(j-1 >= i)//因为不能插入字符,删除 t 的 j 字符,前提是 t 字符串长度不能短于 s, 否则没有意义dp[i][j] = min(dp[i][j], dp[i][j-1]+1);}}}return dp[n1][n2];}
};
36 ms 13.2MB C++