Leetcode-583 两个字符串的删除操作
Leetcode-583 两个字符串的删除操作
-
题目
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例:
输入: "sea", "eat"
输出: 2
解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea" -
解题思路
两个字符串删除后字符串相同,意思同子长公共子序列一致,因此我们可以直接通过动态规划求出最长公共子序列s,则最少的步数为
res=len(word1)-len(s)+len(word2)-len(s)
求最长公共子序列:
通过dp矩阵存储最长公共子序列的长度,
dp[i][j]
代表word1[0:i]
和word2[0:j]
的最长公共子序列的长度,此时:当word1[i]==word2[j]时,
dp[i][j]=dp[i-1][j-1]+1
例子:
'sea'、'ea',word1[2]=word[2],所以此时的最长公共子序列长度
dp[i][j]
='se'和'e'的最长公共子序列长度+1当word1[i]!=word2[j]时,
dp[i][j]=max(dp[i][j-1],dp[i-1][j]
例子:
'sea'、'eat',word1[2]!=word2[2],此时
dp[2][2]
就是在'sea','ea'的最长公共子序列长度和'se'、'eat'的最长公共子序列的最大值 -
代码实现
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
len1=len(word1)
len2=len(word2)
dp=[[0 for i in range(len2+1)] for j in range(len1+1)]
for i in range(1,len1+1):
for j in range(1,len2+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 len1+len2-2*dp[-1][-1]