当前位置:网站首页>72. 编辑距离 ●●●

72. 编辑距离 ●●●

2022-06-10 19:49:00 chenyfan_

72. 编辑距离 ●●●

描述

给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:

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

示例

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

题解

1. 动态规划(子序列问题)

  1. dp[i][j]表示以 s[i-1], t[j-1]为末尾时所需操作步数
  2. if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1];
    如果当前这对字符相等,等于上一组数的步数,即都不操作
    if(s[i-1] != t[j-1]) dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j])) + 1;
    如果字符不相等,则根据步数来判断删除当前遍历行还是列上的字符(在字符串1删除元素,等效于在另一字符串增加元素),或者在上一组的基础上替换其中一个字符。
  3. 边界条件初始化:
    dp[0][j] = j;
    dp[i][0] = i; 意味着空字符与其他字符串匹配的步数;
  4. 双层循环,从上到下,从左到右。

时间复杂度: O ( n × m ) O(n × m) O(n×m)
空间复杂度: O ( n × m ) O(n × m) O(n×m)
在这里插入图片描述

class Solution {
    
public:
    int minDistance(string word1, string word2) {
    
        int len1 = word1.length();
        int len2 = word2.length();
        vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0));
        for(int i = 0; i <= len1; ++i) dp[i][0] = i;    // 边界条件初始化
        for(int j = 0; j <= len2; ++j) dp[0][j] = j;
        for(int i = 1; i <= len1; ++i){
    
            for(int j = 1; j <= len2; ++j){
    
                if(word1[i-1] == word2[j-1]){
    
                    dp[i][j] = dp[i-1][j-1];                    // 相等时,等于上一组数的步数
                }else{
      
                    dp[i][j] = min(dp[i-1][j-1], min(dp[i][j-1], dp[i-1][j])) + 1; // 根据更小的步数来判断操作
                }
            }
        }
        return dp[len1][len2];
    }
};
原网站

版权声明
本文为[chenyfan_]所创,转载请带上原文链接,感谢
https://blog.csdn.net/qq_19887221/article/details/125226839