leetcode 72 编辑距离

简介: leetcode 72 编辑距离

33a9c2a4fecd4bd7b471e25971ab649e.png

动态规划

  • 确定dp数组以及下标的含义
    dp[i][j] 表示前 i 个字符的word1,和前 j 个字符的word2,最近编辑距离。
  • 递推公式
  • if (word1[ i ] == word2[ j ]) 那么说明不用任何编辑,
    即dp[i+1][j+1] = dp[i ][j ];
  • if (word1[ i ] != word2[ j ]) 有三种情况

删除world1

word1第 i 个字符删除一个元素,就是world1第 i -1 与world2第 j 再加上一个操作。

即 dp[i+1][j+1] = dp[ i ][ j+1] + 1;

删除world2(相当于添加world1)

word2第 j 个字符删除一个元素,就是world1第 i 与world2第 j -1 再加上一个操作。

即 dp[i+1][j+1] = dp[ i +1][ j] + 1;

替换元素

word1第 i 个字符和word1第 i -1个字符替换,world2同样,就是world1第 i -1 与world2第 j -1 再加上一个操作。

即 dp[i+1][j+1] = dp[ i ][ j] + 1;

最终三种情况取最小

dp[i+1][j+1] = min( dp[i][j] , min(dp[i][j+1],dp[i+1][j])) + 1;

dp数组初始化

  • dp[i][0] :以下标i-1为结尾的字符串word1,和空字符串word2,最近编辑距离为dp[i][0]。
    那么dp[i][0]就应该是i,对word1里的元素全部做删除操作,即:dp[i][0] = i;
  • 同理dp[0][j] = j;

5f7082005f9b4393a3600f2b7250bb4f.png


6af5b765e42c48e89f84cdc712b16ab3.png

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1 , vector<int>(word2.size()+1));
        for(int i=0 ; i<word1.size();i++)
            dp[i+1][0] = i+1;
        for(int j=0 ; j<word2.size();j++)
            dp[0][j+1] = j+1;
        for(int i=0;i<word1.size();i++)
        {
            for(int j=0; j<word2.size();j++)
            {
                if(word1[i] == word2[j]) dp[i+1][j+1] = dp[i][j];
                else dp[i+1][j+1] = min( dp[i][j] , min(dp[i][j+1],dp[i+1][j])) + 1;
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

二刷

class Solution {
public:
    int minDistance(string word1, string word2) {
        vector<vector<int>> dp(word1.size()+1 , vector<int>(word2.size()+1 , 0) );
        for(int i=0 ; i<=word1.size() ;i++)
            dp[i][0] = i;
        for(int j=0 ; j<=word2.size() ;j++)
            dp[0][j] = j;
        for(int i=1 ; i<=word1.size() ;i++)
        {
            for(int j=1 ; j<=word2.size() ;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]+1 , min( dp[i-1][j]+1,dp[i][j-1]+1 ) );
                // cout<<dp[i][j]<<' ';
            }
            // cout<<endl;
        }
        return  dp[word1.size()][word2.size()];
    }
};
相关文章
|
6月前
leetcode-72:编辑距离
leetcode-72:编辑距离
47 0
|
5月前
|
存储 算法 数据可视化
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
深入解析力扣161题:相隔为 1 的编辑距离(逐字符比较与动态规划详解)
|
6月前
代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离
代码随想录 Day47 动态规划15 LeetCode T583 两个字符串的删除操作 T72 编辑距离
61 0
|
6月前
|
Go
golang力扣leetcode 72.编辑距离
golang力扣leetcode 72.编辑距离
41 0
|
人工智能 Unix Linux
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)
以 Unix 风格给出一个文件的绝对路径,你需要简化它。或者换句话说,将其转换为规范路径。 在 Unix 风格的文件系统中,一个点(.)表示当前目录本身;此外,两个点 (…) 表示将目录切换到上一级(指向父目录);两者都可以是复杂相对路径的组成部分。更多信息请参阅:Linux / Unix中的绝对路径 vs 相对路径
126 0
LeetCode 70爬楼梯&71简化路径&72编辑距离(dp)
代码随想录刷题|LeetCode 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇
代码随想录刷题|LeetCode 583. 两个字符串的删除操作 72. 编辑距离 编辑距离总结篇
|
算法 Python
[动态规划]Leetcode72.编辑距离(python)
[动态规划]Leetcode72.编辑距离(python)
☆打卡算法☆LeetCode 72、编辑距离 算法解析
“给定两个单词,计算出单词1转换为单词2所最少操作数。”
LeetCode 72*. 编辑距离(Python)
给定两个单词 word1 和 word2,计算出将 word1 转换成 word2 所使用的最少操作数 。
LeetCode 72*. 编辑距离(Python)
LeetCode 训练场:72. 编辑距离
LeetCode 训练场:72. 编辑距离
91 0