72. 编辑距离

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数  。

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

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

示例 1:

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

示例 2:

输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention (将 'i' 替换为 'e')
enention -> exention (将 'n' 替换为 'x')
exention -> exection (将 'n' 替换为 'c')
exection -> execution (插入 'u')

提示:

  • 0 <= word1.length, word2.length <= 500
  • word1 和 word2 由小写英文字母组成

   dp[i][j]:[0- i-1]区间的s 和 [0- j-1]区间的t,相同,最少的操作次数为dp[i][j]
        

        递推关系:1、s[i-1] == t[j-1]:不需要操作,直接继承上一个状态的次数,即不加这两个字符。dp[i][j] = dp[i-1][j-1];
        2、s[i-1] != t[j-1];需要操作:1、添加、删除、替换。
            1、添加:就是逆向的删除。
            2、删除:既然s[i-1]不符合,那就把它删了,缩小区间。[0- i-2]这个区间的做少操作次数。dp[i-1][j]+1;
            也可以删t[i-1]。和上面同理
            也可以,把两个都删了
        3、替换。如何让s[i-1] == t[j-1],只需要替换一次,而s[i-1]==t[i-1]对应的次数是dp[i-1][j-1] 这里再额外加一,dp[i-1][j-1]+1;

        
        初始化:dp[i][j]由[i-1][j-1],[i-1][j],[i][j-1]推出来

class Solution {
public:
    int minDistance(string s, string t) {
        //dp[i][j]:[0- i-1]区间的s 和 [0- j-1]区间的t,相同,最少的操作次数为dp[i][j]
        vector>dp(s.size()+1,vector(t.size()+1,0));

        //递推关系:1、s[i-1] == t[j-1]:不需要操作,直接继承上一个状态的次数,即不加这两个字符。dp[i][j] = dp[i-1][j-1];
        //2、s[i-1] != t[j-1];需要操作:1、添加、删除、替换。
            //1、添加:就是逆向的删除。
            //2、删除:既然s[i-1]不符合,那就把它删了,缩小区间。[0- i-2]这个区间的做少操作次数。dp[i-1][j]+1;
            //也可以删t[i-1]。和上面同理
            //也可以,把两个都删了
        //3、替换。如何让s[i-1] == t[j-1],只需要替换一次,而s[i-1]==t[i-1]对应的次数是dp[i-1][j-1] 这里再额外加一,dp[i-1][j-1]+1;

        
        //初始化:dp[i][j]由[i-1][j-1],[i-1][j],[i][j-1]推出来
        for(int i = 0;i <= s.size();i++){
            dp[i][0] = i;
        }
        for(int j = 0;j <= t.size();j++){
            dp[0][j] = j;
        }

        for(int i = 1;i <= s.size();i++){
            for(int j = 1;j <= t.size();j++){
                if(s[i-1] == t[j-1]){
                    dp[i][j] = dp[i-1][j-1];
                }
                else dp[i][j] = min(min(dp[i-1][j]+1,dp[i][j-1]+1), dp[i-1][j-1]+1);
            }
        }
        return dp[s.size()][t.size()];
    }
};

你可能感兴趣的:(leetcode练习,c++,动态规划)