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

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

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

示例 1:

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

示例  2:

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

提示:

  • 1 <= word1.length, word2.length <= 500
  • word1 和 word2 只包含小写英文字母

Solution:

一、DP定义

 删除操作就是考不考虑

dp[i][j]:[0- i-1]区间的s字符串 和 [0- j-1]区间的t字符串 相同 最少需要需要操作dp[i][j]次
       

二、递推关系

s[i-1] == t[j-1]:不需要操作,最少操作次数和上一个状态,即各不加目前的字母一样。dp[i][j] = dp[i-1][j-1];
s[i-1] != t[j-1]:需要进行操作,有两个来源。

1、操作s字符串,不加s[i-1],看之前需要操作几次,相当于就是删掉s[i-1];dp[i][j] = dp[i-1][j];
2、操作t字符串。不加t[i-1]这个字符,看之前需要操作几次=s[j-1],相当于就是删除t[j-1];dp[i][j] = dp[i][j-1];
不相等情况 有两个来源,需要取min(1,2);


三、初始化:

dp[i][j]的状态由 [i-1],[j-1],[i-1][j],[i][j-1]得来。所以得对第一行和第一列进行初始化。

class Solution {
public:
    int minDistance(string s, string t) {
        //删除操作就是考不考虑

        //dp[i][j]:[0- i-1]区间的s字符串 和 [0- j-1]区间的t字符串 相同 最少需要需要操作dp[i][j]次
        vector>dp(s.size()+1,vector(t.size()+1,0));
       
        for(int i = 0;i <= s.size();i++){
            dp[i][0] = i;//s中有几个,就删除几个,变为空字符串
        }
        for(int j = 0;j <= t.size();j++){
            dp[0][j] = j;
        }

        for(int i = 1;i <= s.size();i++){
            for(int j = 1;j <= t.size();j++){
                if(s[i-1] == t[j-1]) dp[i][j] = dp[i-1][j-1];
                else dp[i][j] = min(dp[i-1][j]+1, dp[i][j-1]+1);
            }
        }
        return dp[s.size()][t.size()];
    }
};

你可能感兴趣的:(leetcode练习,动态规划,c++)