Q:
给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
示例 1:
输入: "sea", "eat" 输出: 2 解释: 第一步将"sea"变为"ea",第二步将"eat"变为"ea"
链接:https://leetcode-cn.com/problems/delete-operation-for-two-strings/description/
思路:这道题目是求最长子串(有序但不必须连续),而不是最长子序列(要求连续),因此还是使用动态规划的方法,数组res用来统计最长子串的大小,然后返回值是两个字符串减去子串的长度
s | e | a | ||
0 | 0 | 0 | 0 | |
e | 0 | 0 | 1 | 1 |
a | 0 | 0 | 1 | 2 |
t | 0 | 0 | 1 | 2 |
代码:
class Solution(object):
def minDistance(self, word1, word2):
"""
:type word1: str
:type word2: str
:rtype: int
"""
m = len(word1)
n = len(word2)
if m == 0 or n == 0:
return abs(m - n)
res = [[0] * (n+1) for _ in range(m+1)]
for i in range(1,m+1):
for j in range(1,n+1):
if word1[i-1] == word2[j-1]:
res[i][j] = res[i-1][j-1] + 1
else:
res[i][j] = max(res[i - 1][j], res[i][j - 1])
return abs(m+n - 2 * res[-1][-1])