给定两个字符串,寻找最小的操作数,使得word1变为word2.
1.可以插入字符
2.可以删除字符
3.可以替换字符
对于上面的讲解如下:
1.对应位置相同则不去扣分即不进行任何操作,不同则扣一分(需要修改)
2.两个特殊字符”-“不会对应的意思是,可以反过来理解,如果两个特殊字符对应,那么特殊字符的位置不可能是在字符之间,只有在两端,而在两端的话无任何意义,所以不存在两个特殊字符对应的情况出现
3.S 出现“-”表示需要增加字符,操作+1
4.T 出现“-”表示S中需要删除字符,操作+1
那么这个状态转移方程就可以出来了:
dp[i][j]=Math.min((dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1))?0:1),Math.min(dp[i-1][j]+1,dp[i][j-1]+1))
//注意此刻word字符得位置 长度为i 字符串的第i位为i-1
//source前i-1字符与target 前j-1字符相同,所以需要考虑source的第i个字符和target的第j个字符是否相同,若相同则不需要操作,若不同则操作需要+1
dp[i][j]= Math.min(dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1)?0:1),
//dp[i-1][j]+1 soure 字符串前i-1 与 target字符串 相同 所以差一个 需要1
//dp[i][j-1]+1 soure 字符串前i 与 target 前j-1 字符串 相同 所以差一个 需要操作1
Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
代码:
public class Solution {
public int minDistance(String word1, String word2) {
int len_word1 = word1.length();
int len_word2 = word2.length();
int dp[][] = new int[len_word1+1][len_word2+1];
for(int i=0;i<=len_word1;i++){
for(int j=0;j<=len_word2;j++){
if(i==0){
dp[i][j]=j;//表示source没有字符,则target有j个字符就需要进行j次操作
}
else if(j==0){
dp[i][j]=i;//同理 表示 target 没有字符,则source有i个字符就需要进行i次操作
}
//s[i-1] is the same as t[i-1] i is from 1 to i
else{
//注意此刻word字符得位置 长度为i 字符串的第i位为i-1
dp[i][j]= Math.min(dp[i-1][j-1]+(word1.charAt(i-1)==word2.charAt(j-1)?0:1),
//dp[i-1][j]+1 soure 字符串前i-1 与 target字符串 相同 所以差一个 需要操作1
//dp[i][j-1]+1 soure 字符串前i 与 target 前j-1 字符串 相同 所以差一个 需要操作1
Math.min(dp[i-1][j]+1,dp[i][j-1]+1));
}
}
}
return dp[len_word1][len_word2];
}
}