zoukankan      html  css  js  c++  java
  • 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 };
  • 相关阅读:
    敏捷开发宣言
    OpenGL SL 优化要点
    Cocoa Touch 开发框架
    MSIL详解
    Android之Services
    Android之ActivityII
    Android之Activity
    托管执行过程
    Android之Content ProviderII
    Android之Content Providers
  • 原文地址:https://www.cnblogs.com/LJ-LJ/p/11481123.html
Copyright © 2011-2022 走看看