看到这题我就想到了72,编辑距离那题真的是脑汁噩梦……
回到这题上来,这题只是要求删除字符,那么必然是要求出两个单词之间的最长公共子序列。这个子序列越长,那么需要删除的字符就越少。
那么显然这题就是要用动态规划了。比较两个字符的时候,分两种情况,字符一样和字符不一样
dp[i][j]=
word[i] == word[j], 那么就大家各进一步,1+dp[i+1][j+1]
word[i] != word[j],那么挑选一个丢掉,max(dp[i][j+1], dp[i+1][j])
最后考虑边界条件,i == len(word1) 或者 j == len(word2) 的时候,返回 0
class Solution: def minDistance(self, word1: str, word2: str) -> int: maxi = len(word1) maxj = len(word2) dp = [[0] * (maxj + 1) for _ in range(maxi + 1)] for i in range(maxi + 1): dp[i][maxj] = 0 for j in range(maxj + 1): dp[maxi][j] = 0 for i in range(maxi - 1, -1, -1): for j in range(maxj - 1, -1, -1): if word1[i] == word2[j]: dp[i][j] = 1 + dp[i + 1][j + 1] else: dp[i][j] = max(dp[i + 1][j], dp[i][j+1]) return maxi + maxj - 2 * dp[0][0]