题目描述
Given two words word1 and word2, find the minimum number of steps required to make word1 and word2 the same, where in each step you can delete one character in either string.
Example 1:
Input: “sea”, “eat”
Output: 2
Explanation: You need one step to make “sea” to “ea” and another step to make “eat” to “ea”.
Note:
The length of given words won’t exceed 500.
Characters in given words can only be lower-case letters.
给出了两个字符串,可以删除两个字符串中的某些字符,求最少删除多少个字符之后两个字符串相等。
本题求的是两个字符串,每次只能从其中一个字符串删除一个字符,最少使用多少步可以使两个字符串变得一样。其实本题就是在变相求两个字符串的最大公共子序列,因为,对于每个字符串,出去公共子序列部分的都是需要删去的部分。
而最大公共子序列,可以通过动态规划来求。
首先,设word1中各个字符为s1,s2,……,sm,word2中各个字符为为t1,t2,……tn。而最大公共子序列为z1,z2……zk。
若sm=tn,明显则有zk=sm=tn,所以s1,s2,……,sm-1与t1,t2,……tn的最大公共子序列就为z1,z2……zk-1。
若sm≠tn,如果zk=sm,则z1,z2……zk是s1,s2,……,sm与t1,t2,……tn-1的最大公共子序列;同理若zk=tn,则z1,z2……zk是s1,s2,……,sm-1与t1,t2,……tn的最大公共子序列。
根据以上的规律,可以得出如下结论:
设dp[i][j]等于word1前i位与word2前j位的最大公共子序列长度。
当i=0或j=0,dp[i][j]=0;
当i>0且j>0,若word1[i]=word2[j],dp[i][j]= dp[i-1][j-1]+1;
当i>0且j>0,若word1[i]≠word2[j],dp[i][j]=max(dp[i][j-1],dp[i-1][j])
根据以上便可得出最大公共子序列的长度,然后得出题目最终结果。
class Solution(object):
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
dp = [[0] * (len(word2) + 1) for _ in range(len(word1) + 1)]
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] + 1
else:
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j])
val = dp[-1][-1]
return len(word1) - val + len(word2) - val
参考:https://blog.csdn.net/u014642924/article/details/72629844
参考:https://blog.csdn.net/fuxuemingzhu/article/details/79821305