力扣算法刷题Day56|动态规划:两个字符串的删除操作 编辑距离

力扣题目:#583. 两个字符串的删除操作

刷题时长:参考题解后5min

解题方法:动态规划

复杂度分析

  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

问题总结

本题收获

  • 动规思路
    • 确定dp数组及下标的含义:dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
    • 确定递推公式:
      • 当word1[i - 1] 与 word2[j - 1]相同:dp[i][j] = dp[i - 1][j - 1]
      • 当word1[i - 1] 与 word2[j - 1]不相同:dp[i][j] = min({dp[i - 1][j - 1] + 2, dp[i - 1][j] + 1, dp[i][j - 1] + 1})

        情况一:删word1[i - 1],最少操作次数为dp[i - 1][j] + 1

        情况二:删word2[j - 1],最少操作次数为dp[i][j - 1] + 1

        情况三:同时删word1[i - 1]和word2[j - 1],操作的最少次数为dp[i - 1][j - 1] + 2

    • dp数组的初始化:dp[i][0]:word2为空字符串,以i-1为结尾的字符串word1要删除多少个元素,才能和word2相同呢,很明显dp[i][0] = i。dp[0][j]同理。
    • 确定遍历顺序:正序
  • 题意可转换为另一种思路:求最长公共子序列,剩余就都是要删除的字母,即用两个字符串的总长度减去两个最长公共子序列的长度就是删除的最少步数

力扣题目:#72. 编辑距离

刷题时长:参考题解后5min

解题方法:动态规划

复杂度分析

  • 时间复杂度: O(n * m)
  • 空间复杂度: O(n * m)

问题总结

  • 难点在分析replace操作如何状态递推
  • word2添加一个元素,相当于word1删除一个元素,增删实则为同一操作,可互相转换

本题收获

  • 动规思路
    • 确定dp数组及下标的含义:dp[i][j] 表示以下标i-1为结尾的字符串word1,和以下标j-1为结尾的字符串word2,最近编辑距离为dp[i][j]
    • 确定递推公式:
      for i in range(1, len(word1)+1):
          for j in range(1, len(word2)+1):
              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, dp[i][j-1]+1, dp[i-1][j-1]+1)
    • dp数组的初始化:
      for i in range(1, len(word1)+1):
          dp[i][0] = i
      for j in range(1, len(word2)+1):
          dp[0][j] = j
    • 确定遍历顺序:正序

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