LeetCode 编辑距离 II(DP)

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++

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: Age of Ai 设计师:meimeiellie 返回首页