Bootstrap

LeetCode583:两个字符串的删除操作

题目链接:583. 两个字符串的删除操作 - 力扣(LeetCode)

代码如下:

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][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(min(dp[i - 1][j] + 1, dp[i][j - 1] + 1), dp[i - 1][j - 1] + 2);
                }
            }
        }

        return dp[word1.size()][word2.size()];
    }
};

dp的含义:以i-1的word1和j-1的word2两个字符串删除使得相同的最小步数

这里的i-1和j-1是为了方便后续的初始化。

dp的递推公式

if(word1[i - 1] == word2[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] + 2);
}

这个其实还是这么判断嘛,这两个相同的话,那么就直接让两个字符串往前走即可,这个时候不需要删除,如果不相同的话,那么这个时候,第一种情况就是word1串删除,也就是dp[i - 1][j] + 1,第二种情况是dp[i][j - 1] + 1的操作,第三种就是这两个都执行删除操作,然后加上2,又因为是求最小的步数嘛,所以就需要这三个最小值即可

初始化:这个初始化其实是需要在dp[i][0]初始化成i,在dp[0][j]初始化成j,因为dp[i][j]这个需要我们有初始化的值,才能往后进行推导

遍历顺序:

这个题目仍然可以通过由左到右,由上到下可以推导出来这个dp,那么遍历顺序就直接按照正常即可

返回值:这个题目返回值仍然是两个各自的字符串长度。

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;