day 56|● 583. 两个字符串的删除操作 ● 72. 编辑距离

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

给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。

每步 可以删除任意一个字符串中的一个字符。

示例 1:

输入: word1 = "sea", word2 = "eat"
输出: 2
解释: 第一步将 "sea" 变为 "ea" ,第二步将 "eat "变为 "ea"
示例  2:

输入:word1 = "leetcode", word2 = "etco"
输出:4

解:

//是不是可以变换成寻找两个字符串的共同字符。
//if word1[i-1]=word[j-1] dp[i][j]=dp[i-1][j-1]+1;
//else dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
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=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]+1;
                else
                    dp[i][j]=max(dp[i-1][j],dp[i][j-1]);
            }
        }
        int co_size=dp[word1.size()][word2.size()];
        cout<<co_size<<endl;
        int result=word1.size()+word2.size()-co_size*2;
        return result;
    }
};

72. 编辑距离

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

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

插入一个字符
删除一个字符
替换一个字符

示例 1:
输入:word1 = "horse", word2 = "ros"
输出:3
解释:
horse -> rorse ('h' 替换为 'r')
rorse -> rose (删除 'r')
rose -> ros (删除 'e')

示例 2:
输入:word1 = "intention", word2 = "execution"
输出:5
解释:
intention -> inention (删除 't')
inention -> enention ('i' 替换为 'e')
enention -> exention ('n' 替换为 'x')
exention -> exection ('n' 替换为 'c')
exection -> execution (插入 'u')

解:

//多种情况的动态规划操作
/*
设dp[i][j]为word1[i-1],word2[j-1]时的让两个单词相同的最少操作
先看递推公式:
若word[i-1]==word[j-1] 则dp[i][j]]=dp[i-1][j-1]
若word[i-1]!=word[j-1] 则要进行删减增操作。
操作一:word1删除一个元素,那么就是以下标i - 2为结尾的word1 与 j-1为结尾的word2的最近编辑距离 再加上一个操作。
即 dp[i][j] = dp[i - 1][j] + 1;
操作二:word2删除一个元素,那么就是以下标i - 1为结尾的word1 与 j-2为结尾的word2的最近编辑距离 再加上一个操作。
即 dp[i][j] = dp[i][j - 1] + 1;
这里有同学发现了,怎么都是删除元素,添加元素去哪了。
word2添加一个元素,相当于word1删除一个元素,例如 word1 = "ad" ,word2 = "a",word1删除元素'd' 和 word2添加一个元素'd',变成word1="a", word2="ad", 最终的操作数是一样!
操作三(替换):
dp[i][j]=dp[i-1][j-1]+1;

即递推公式为:
if word[i-1]==word[j-1] 
    dp[i][j]]=dp[i-1][j-1];
else
    dp[i][j]=min(dp[i-1][j],dp[i][j-1],dp[i-1][j-1])+1;

初始化:
若word1为0时,word2需要做出的操作就是把元素全删了;即
dp[0][j]=j;
若word2为0时,word1需要做出的操作就是把元素全删了;即
dp[i][0]=i;
*/
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(min(dp[i][j-1],dp[i-1][j]),dp[i-1][j-1])+1;
            }
        }
        return dp[word1.size()][word2.size()];
    }
};

你可能感兴趣的:(算法,动态规划,leetcode)