1题目:
给定两个单词 word1
和 word2
,返回使得 word1
和 word2
相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
2分析:
2.1前提:
需要弄清楚子序列和子数组的概念?
子序列:
子序列是由数组派生而来的序列,删除(或不删除)数组中的元素而不改变其余元素的顺序。例如,[3,6,2,7] 是数组 [0,3,1,6,2,2,7] 的子序列。
字符串的一个子序列是指,通过删除一些(也可以不删除)字符且不干扰剩余字符相对位置所组成的新字符串。(例如,"ACE" 是 "ABCDE" 的一个子序列,而 "AEC" 不是)
子数组:
子数组可以理解为连续的子序列,如,[3,6,2,7] 不是数组 [0,3,1,6,2,2,7] 的子数组,而[3,1,6,2] 是数组 [0,3,1,6,2,2,7] 的子数组.
2.2理解题目:
此题可以分为两步解题:
2.2.1求出字符串word1和word2的最长公共子序列temp
2.2.2返回的是word1.length()-temp+word2.length()-temp
2.3代码(java版本)
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length()+1][word2.length()+1];
//dp[i][j]定义为以i-1结尾的word1和以j-1结尾的word2的最长子序列
int ans = 0;
for(int i = 1; i<=word1.length(); i++){
for(int j=1; j<=word2.length(); j++){
if(word1.charAt(i-1) == word2.charAt(j-1)){
dp[i][j] = dp[i-1][j-1]+1;
}else{
dp[i][j] = Math.max(dp[i-1][j],dp[i][j-1]);
}
ans = Math.max(ans, dp[i][j]);
}
}
return word1.length()-ans+word2.length()-ans;
}
}