LeetCode72. Edit Distance 动态规划 C++实现

LeetCode72. Edit Distance 动态规划 C++实现

题目链接

Edit Distance

题目大意

给定两个字符串word1word2,求最短编辑距离,即通过增删改操作能够使得两个字符串变成一个字符串的最少步骤的步数

算法思路

根据题意,基于动态规划的思想,dp[i][j]为子串word1[0...i]与子串word2[0...j]的编辑距离,初始化,第一行,dp[0][i] = i;,第一列,dp[i][0] = i,因为,对于第一行,此时的word1的子串为空串,和word2的子串的距离为word1增加字符的个数,而对于第一列,此时的word2为空串,则word1word2的距离即为word1删除的字符个数,动态转移方程为dp[i][j] = (word1[i - 1] == word2[j - 1] ? dp[i - 1][j - 1] : 1 + min(dp[i - 1][j - 1], min(dp[i - 1][j], dp[i][j - 1])));,即考虑两种情况

  • word1的第i个字符和word2j个字符相等,则无需操作,dp[i][j] = dp[i - 1][j - 1];
  • word1的第i个字符和word2j个字符不相等,可以有三种选择,分别为删除一个word1字符、增加一个word1字符和替换一个word1字符,即基于已完成操作步骤数dp[i - 1][j]删除word1一个字符或增加word2一个字符基于已完成操作步骤数dp[i][j - 1]增加word1一个字符或删除word2一个字符和基于已完成操作步骤数dp[i - 1][j - 1]替换word1word2一个字符,增删改的步骤数都为1,动态转移方程选取最小的一个加上步骤数1

最后返回dp[word1.length()][word2.length()]即可

AC代码

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

样例输入1

horse
ros

样例输出1

3

样例输入2

intention
execution

样例输出2

5

鸣谢

LeetCode

最后

  • 由于博主水平有限,不免有疏漏之处,欢迎读者随时批评指正,以免造成不必要的误解!
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章