给定两个单词 word1 和 word2,找到使得 word1 和 word2 相同所需的最小步数,每步可以删除任意一个字符串中的一个字符。
分析:两种方法,一种取巧,用之前的题目略微改动,第二种方法dp定义为本题。
方法一:还是求最大子序长度的题嘛,返回值改一下就好了。
参考代码:
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++){
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]);
}
}
}
return word1.length()+word2.length()-2*dp[word1.length()][word2.length()];
}
方法二:
dp[i][j]定义为当前使数组相同所需要的最少操作次数
如何得到?答:分为两种情况,一种是当前对比的字符相等,一种是当前对比的字符不相等
情况一相对容易,字符相等就不用操作,将i-1,j-1的操作数复制过来就好啦
情况二就需要对比判断一下取最小操作,分为三个,一个是dp[i-1][j-1]+2,即操作2次
一个是dp[i-1][j]+1,删除i所在字符串的字符
一个是dp[i][j-1]+1,删除j所在字符串的字符
初值?答:需要将二维矩阵的第一行和第一列都设为0至n-1,因为这一行与这一列表示的是一个字符串为空,相等需要几次操作,那么就需要字符串长度的操作。
参考代码:
public int minDistance(String word1, String word2) {
int[][] dp = new int[word1.length()+1][word2.length()+1];
for(int i=0;i<=word1.length();i++){
dp[i][0]=i;
}
for(int i=0;i<=word2.length();i++){
dp[0][i]=i;
}
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];
}
else{
dp[i][j]=Math.min(dp[i-1][j-1]+2,Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
}
return dp[word1.length()][word2.length()];
}
