583. 两个字符串的删除操作
原始题目链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings/
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例:
输入: “sea”, “eat”
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"
解题思路:
转换为两个字符串的长度之和减去两个字符串的最长公共子序列长度的2倍,2倍是因为两个字符都需要减掉最长公共子序列的长度大小的步数,剩下的大小就是字符需要修正的大小,即题目要求的返回值。两个字符串的最长公共子序列解法使用动态规划,定义动态方程数组dp[i][j]表示字符串word1[:i]和字符串word2[:j]的最长公共子序列的长度。具体实现看代码及注释。
代码实现:
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
m, n = len(word1), len(word2)
# 定义动态转移方程dp[i][j]: word1[:i] word2[:j]的最长公共子序列的长度
dp = [[0] * (n + 1) for _ in range(m + 1)]
for i in range(1, m + 1):
for j in range(1, n + 1):
# 两个状态条件,当前子字符串相等则用上个状态+1
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])
return m + n - 2 * dp[-1][-1]
参考文献:
https://leetcode-cn.com/problems/delete-operation-for-two-strings/solution/dong-tai-gui-hua-by-whosedangeroussmile/