题目
示例
思路:区间动态规划
状态
dp[i][j]表示将word1(0,i)转换成word2(0,j)的方案数。
需要考虑在字符串前面加一个空字符,第一行表示word1为空,word2不为空时的编辑次数;第一列表示word2为空,word1不为空时的编辑次数。
转移方程
如果word[i] == word[j]
dp[i][j] = dp[i-1][j-1];
否则取替换,删除,增加的最小值+1
dp[i][j] = min(dp[i-1][j],dp[i-1][j-1],dp[i][j-1])+1;
具体代码
class Solution {
public int minDistance(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
if(len1 == 0){
return len2;
}
int[][] dp = new int[len1+1][len2+1];
dp[0][0] = 0;
for(int i = 1;i <= len1;i++){
dp[i][0] = i;
for(int j = 1;j <= len2;j++){
dp[0][j] = 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],Math.min(dp[i-1][j-1],dp[i][j-1]))+1;
}
}
}
return dp[len1][len2];
}
}
时间复杂度:O(m*n), m,n分别为两个字符串的长度
空间复杂度:O(m*n)