583. 两个字符串的删除操作¶
力扣链接(中等):https://leetcode.cn/problems/delete-operation-for-two-strings
给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1:
示例 2:
提示:
1 <= word1.length, word2.length <= 500
word1
和word2
只包含小写英文字母
个人题解¶
方法一¶
-
dp[i][j]
表示word1
和word2
中区间分别为[0, i - 1]
和[0, j - 1]
的子串相等所需删除的最小次数; -
初始化
dp
:dp[i][0]
代表word2
长度为0
时,word1
至少要删除多少次才能和word2
相等;dp[0][j]
同理; -
状态转移:如果当前项相等,那么在
dp[i - 1][j - 1]
基础上,不用删除任何项,即dp[i][j] = dp[i - 1][j - 1]
;如果当前项不相等,则有三种情况:- 删除
word1
中的当前项:在word1[0, i - 2]
和word2[0, j - 1]
子串相等所需删除次数的基础上,再删除一次,即dp[i][i] = dp[i - 1][j] + 1
; - 删除
word2
中的当前项:在word1[0, i - 1]
和word2[0, j - 2]
子串相等所需删除次数的基础上,再删除一次,即dp[i][i] = dp[i][j - 1] + 1
; - 分别对
word1
和word2
删除当前项:在word1[0, i - 2]
和word2[0, j - 2]
子串相等所需删除次数的基础上,再删除两次,即dp[i][i] = dp[i - 1][j - 1] + 2
;
取上面三种情况的最小值作为
dp[i][j]
即可。 - 删除
方法二¶
转换为最长公共子序列的逻辑求解:1035/1143. 不相交的线/最长公共子序列
要使得两个字符串相等,那么就是找两个子串的公共部分,最后,用两个串的总长度减去求得的最长公共子序列的长度即可。