1 两个字符串的删除操作
题目
给定两个单词 word1 和 word2 ,返回使得 word1 和 word2 相同所需的最小步数。
每步 可以删除任意一个字符串中的一个字符。
代码
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp=new int[word1.length()+1][word2.length()+1];
for(int i=1;i<=word1.length();i++){
char char1=word1.charAt(i-1);
for(int j=1;j<=word2.length();j++){
char char2=word2.charAt(j-1);
if(char1==char2)
dp[i][j]=dp[i-1][j-1]+1;
else
dp[i][j]=Math.max(dp[i][j-1],dp[i-1][j]);
}
}
return (word1.length()+word2.length())-2*dp[word1.length()][word2.length()];
}
}
总结
根据相对子序列的最大长度,求出需要几次删除操作。
*2 编辑距离
题目
给你两个单词 word1 和 word2, 请返回将 word1 转换成 word2 所使用的最少操作数 。
你可以对一个单词进行如下三种操作:
插入一个字符
删除一个字符
替换一个字符
代码
class Solution {
public int minDistance(String word1, String word2) {
int[][] dp=new int[word1.length()+1][word2.length()+1];
for(int i=1;i<=word1.length();i++) dp[i][0]=i;
for(int j=1;j<=word2.length();j++) dp[0][j]=j;
for(int i=1;i<=word1.length();i++){
char char1=word1.charAt(i-1);
for(int j=1;j<=word2.length();j++){
char char2=word2.charAt(j-1);
if(char1==char2)
dp[i][j]=dp[i-1][j-1];
else
dp[i][j]=Math.min(Math.min(dp[i - 1][j - 1], dp[i][j - 1]), dp[i - 1][j]) + 1;
}
}
return dp[word1.length()][word2.length()];
}
}
总结
有三种操作,我就对dp的递推公式有点乱了。但看看题解,觉得还是应该仔细分析,不应该直接放弃。