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)