https://leetcode.com/problems/edit-distance/
Given two words word1 and word2, find the minimum number of steps required to convert word1 to word2. (each operation is counted as 1 step.)
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
distance[i][j]表示word1的前i个字符到word2的前j个字符的距离。
递推公式是:
1. 如果word.charAt(i-1) == word.charAt(j-1), 那么distance[i][j] = distance[i-1][j-1]
2. 否则,就是distance[i-1][j], distance[i][j-1], distance[i][j]的最小值加1.
当i==0 或者 j==0的话,那就只能插入或删除,distance[i][j]就等于j或者i.
public class Solution {
public int minDistance(String word1, String word2) {
if(word1 == null || word1.length()==0) return word2==null? 0 : word2.length();
if(word2 == null || word2.length()==0) return word1==null? 0 : word1.length();
int[][] distance = new int[word1.length()+1][word2.length()+1];
distance[0][0] = 0;
for(int i=0; i<=word1.length(); i++){
for(int j=0; j<=word2.length(); j++){
if(i==0 && j==0) continue;
if(i==0){
distance[i][j] = j;
continue;
}
if(j==0){
distance[i][j] = i;
continue;
}
if(word1.charAt(i-1)==word2.charAt(j-1)){
distance[i][j] = distance[i-1][j-1];
}
else{
distance[i][j] = Math.min(Math.min(distance[i-1][j], distance[i][j-1])+1, distance[i-1][j-1]+1);
}
}
}
return distance[word1.length()][word2.length()];
}
}
不能用一维DP做哈,
distance[i][j] = Math.min(Math.min(distance[i-1][j], distance[i][j-1])+1, distance[i-1][j-1]+1);
这一句,同时用到了上一轮的j-1和这一轮的j-1,所以一维数组肯定不行,因为一维的话就只能保存一轮的distance值了。
时间复杂度和空间复杂度都是O(m*n)