题目:
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
思路:
本质:求最长公共子序列
解答:
方法一:动态规划,求最长公共子序列的长度,再转化求解
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
#本质:求最长公共子序列
m=len(word1)
n=len(word2)
dp=[[0]*(n+1) for _ in range(m+1)]
for i in range(m):
for j in range(n):
if word1[i]==word2[j]:
dp[i+1][j+1]=dp[i][j]+1
else:
dp[i+1][j+1]=max(dp[i][j+1],dp[i+1][j])
return m+n-2*dp[m][n]
方法二:动态规划,直接求删除次数
class Solution:
def minDistance(self, word1: str, word2: str) -> int:
#dp[i][j]:以i-1为结尾的字符串word1,和以j-1位结尾的字符串word2,想要达到相等,所需要删除元素的最少次数
m=len(word1)
n=len(word2)
dp=[[0]*(n+1) for _ in range(m+1)]
#初始化
for i in range(m+1):
dp[i][0]=i
for j in range(n+1):
dp[0][j]=j
for i in range(m):
for j in range(n):
if word1[i]==word2[j]:
dp[i+1][j+1]=dp[i][j]
else:
dp[i+1][j+1]=min(dp[i+1][j]+1,dp[i][j+1]+1,dp[i][j]+2)
return dp[m][n]