583. 两个字符串的删除操作¶
力扣链接(中等):https://leetcode.cn/problems/delete-operation-for-two-strings
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1:
示例 2:
提示:
1 <= word1.length, word2.length <= 500word1和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. 不相交的线/最长公共子序列
要使得两个字符串相等,那么就是找两个子串的公共部分,最后,用两个串的总长度减去求得的最长公共子序列的长度即可。