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

题目描述:

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

示例 1:

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

说明:

  1. 给定单词的长度不超过500。
  2. 给定单词中的字符只含有小写字母。

思路分析:

这实际是最长公共子序列的一个变形题。注意在这类题目中,子序列是可不连续的,而子串是连续的。这里就利用dp[i][j]数组表示字符串1的0-i和字符串2的0-j之间的最长公共序列。状态转移方程为若当前所指的两个字符相等,则dp[i][j] = dp[i-1][j-1]+1,否则,dp[i][j] = max(dp[i][j-1], dp[i-1][j])。时间复杂度为O(n*m),空间复杂度为O(n*n)。

代码:

 1 class Solution {
 2 public:
 3     int minDistance(string word1, string word2) {
 4         int len1 = word1.length();
 5         int len2 = word2.length();
 6         vector<vector<int>> dp(len1+1, vector<int>(len2+1, 0));
 7         for(int i=0; i<=len1; i++)
 8         {
 9             for(int j=0; j<=len2; j++)
10             {
11                 if(i==0 || j==0)
12                 {
13                     dp[i][j]=0;
14                     continue;
15                 }
16                 if(word1[i-1]==word2[j-1])
17                 {
18                     dp[i][j] = dp[i-1][j-1]+1;
19                 }
20                 else
21                 {
22                     dp[i][j] = max(dp[i-1][j], dp[i][j-1]);
23                 }
24             }
25         }
26         return (len1+len2-2*dp[len1][len2]);
27     }
28 };
原文地址:https://www.cnblogs.com/LJ-LJ/p/11481123.html