两个字符串的删除操作
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
示例 1:
输入: word1 = “sea”, word2 = “eat”
输出: 2
解释: 第一步将 “sea” 变为 “ea” ,第二步将 "eat "变为 “ea”
示例 2:
输入:word1 = “leetcode”, word2 = “etco”
输出:4
提示:
1 <= word1.length, word2.length <= 500
word1 和 word2 只包含小写英文字母
题解
集合:
d
p
[
i
]
[
j
]
dp[i][j]
dp[i][j]为
w
o
r
d
1
[
下
标
从
1
到
i
]
=
=
w
o
r
d
2
[
下
标
从
1
到
j
]
word1[下标从1到i]==word2[下标从1到j]
word1[下标从1到i]==word2[下标从1到j] 所需要的最小步数
集合的划分:word1[i]和word2[j]是否在相同的字符串中
四种情况:
d
p
[
i
]
[
j
]
=
m
i
n
(
d
p
[
i
−
1
]
[
j
−
1
]
+
2
,
d
p
[
i
−
1
]
[
j
]
+
1
,
d
p
[
i
]
[
j
+
1
]
+
1
,
d
p
[
i
−
1
]
[
j
−
1
]
)
dp[i][j] = min(dp[i-1][j-1]+2,dp[i-1][j]+1,dp[i][j+1]+1,dp[i-1][j-1])
dp[i][j]=min(dp[i−1][j−1]+2,dp[i−1][j]+1,dp[i][j+1]+1,dp[i−1][j−1])
如果word1[i]==word2[j]那么一定都在其中:
d
p
[
i
−
1
]
[
j
−
1
]
dp[i-1][j-1]
dp[i−1][j−1] 这一种
如果不相等那么考虑:
d
p
[
i
−
1
]
[
j
−
1
]
+
2
,
d
p
[
i
−
1
]
[
j
]
+
1
,
d
p
[
i
]
[
j
+
1
]
+
1
dp[i-1][j-1]+2,dp[i-1][j]+1,dp[i][j+1]+1
dp[i−1][j−1]+2,dp[i−1][j]+1,dp[i][j+1]+1 这三种
class Solution {
public int minDistance(String word1, String word2) {
int n = word1.length();
int m = word2.length();
int dp[][] = new int[n+1][m+1];
for(int i=0; i<=n; ++i) Arrays.fill(dp[i],0);
for(int i=0; i<=n; ++i){
dp[i][0] = i;
}
for(int i=0; i<=m; ++i){
dp[0][i] = i;
}
for(int i=1; i<=n; ++i){
for(int j=1; j<=m; ++j){
if(word1.charAt(i-1)==word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1];
}
else{
dp[i][j] = Math.min(dp[i-1][j]+1,Math.min(dp[i][j-1]+1,dp[i-1][j-1]+2));
}
}
}
return dp[n][m];
}
}