代码随想录算法训练营第56天|583. 两个字符串的删除操作、72. 编辑距离

583. 两个字符串的删除操作

题目描述:给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。

思路:其他的根据之前的经验很好想到,主要是初始化不同。

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

72. 编辑距离

题目描述:

给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符

  • 删除一个字符

  • 替换一个字符

思路:有了之前的铺垫,这题就相当简单了。替换和删除其实就是同一种操作,直接按照之前的理解,按着删除来做。然后就变成了删除和替换操作。所以就有了下面代码用到的递推公式。

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

你可能感兴趣的:(算法,c++,开发语言)