思路
1.定义dp数组
dp[i][j]是s以下标i-1和t下标为j-1结束的两个字符串删除最少dp[i][j]步相同。
注:这里i-1和j-1是为了初始化方便。
2.递推公式
如果s中下标为i-1的字符和t中以下标为j-1的字符相同,则dp[i][j] = dp[i-1][j-1];
就是如果当前两个字符相等,则当前两个字符不用删除,就是将各自之前的删除为相同的即可。
如果不相等的话,就是要将当前两个字符中删去一个或者两个都删除后得到的子字符串相同的步数最少。
即:
dp[i][j] = dp[i-1][j-1]+2,dp[i-1][j] + 1.dp[i][j-1] + 1中最小的一个。
3.dp数组的初始化
根据定义即可得
dp[i][0] = i;
dp[0][j] = j;
4.遍历dp数组
根据递推公式可以知道是正序遍历的。
5.打印dp数组
dp数组的最后一个就是最后的结果。
代码
class Solution {
public int minDistance(String word1, String word2) {
int l1 = word1.length();
int l2 = word2.length();
int dp[][] = new int[l1+1][l2+1];
for(int i= 0;i<= l1;i++){
dp[i][0] = i;
}
for(int j= 0;j<= l2;j++){
dp[0][j] = j;
}
for(int i =1;i<=l1;i++){
for(int j = 1;j<=l2;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[l1][l2];
}
}