leetcode 72 编辑距离 DP

放一个精选题解

一定要考虑边界情况,二者均为空的情况,以及学习这种递推式的设计(到word1的i位置的字符串转为到word2的j位置的字符串这种关系的设计)

在i位置和j位置二者不一样时,对于替换删除和增加的理解:

因为是要把word1到i位置的字符串变成word2的字符串的j位置的字符串,所以最终的结果i位置和j位置一定是一样的。如果是替换,就相当于直接让二者的最后一个位置相等了,然后回过头来看dp[i-1][j-1]

如果是删除,那把word1的第i个删除掉,也只能回过头来看dp[i-1][j]了,如果是插入一个,那相当于i+1的位置和j的位置要一致,那就要回过头来看dp[i][j-1]了。所以有这三种递推式。千万记得这三种的选择都是一种操作,选出来最小的操作一定要加1.

DP就是有这种强大的能力让复杂事情简单化!

class Solution {
public:
    int minDistance(string word1, string word2) {
        int m=word1.size();
        int n=word2.size();
        vector<vector<int>> dp(m + 1, vector<int>(n + 1, 0));
        //多一行一列存边界情况
        for (int i = 0; i < m+1; i++) {
            dp[i][0] = i;
        }
        for (int j = 0; j < n+1; j++) {
            dp[0][j] = j;
        }

        for (int i = 1; i < m+1; i++) {
            for (int j = 1; j < n+1; 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 - 1][j], dp[i][j - 1])) + 1;
                }
            }
        }
        return dp[m][n];
    }
};
每天进步一点点~
原文地址:https://www.cnblogs.com/libin123/p/14675275.html