题目描述
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
哇终于在DP上找到点感觉!
dist[i][j]表示word1 1~i通过dist[i][j]种次操作变到word2 1~j。
当word1.charat(i) == word2.charat(j)时,dist[i][j] = dist[i - 1][j - 1];
否则,有三种选择:
1)如果dist[i - 1][j]最小,则dist[i][j] = dist[i - 1][j] + 1(word1末尾的一次删除操作);
2)如果dist[i - 1][j - 1]最小,则dist[i][j] = dist[i - 1][j - 1] + 1(word1末尾的字符替换成word2末尾的字符);
3)如果dist[i][j - 1]最小,则dist[i][j] = dist[i][j - 1] + 1(说明这次的word2的末尾字符插入到word1末尾即可);
public class Solution {
public int minDistance(String word1, String word2) {
if(word1.equals("") || word2.equals(""))
return word1.equals("") ? word2.length():word1.length();
int len1 = word1.length() + 1;
int len2 = word2.length() + 1;
int [][] dist = new int [len1][len2];
dist[0][0] = 0;
for(int i = 1; i < len1; ++i)
dist[i][0] = i;
for(int i = 1; i < len2; ++i)
dist[0][i] = i;
for(int i = 1; i < len1; ++i){
for(int k = 1; k < len2; ++k){
if(word1.charAt(i - 1) == word2.charAt(k - 1)){
dist[i][k] = dist[i - 1][k - 1];
}else{
int temp = dist[i - 1][k] > dist[i - 1][k - 1]? dist[i - 1][k - 1] : dist[i - 1][k];
int min = temp > dist[i][k - 1]? dist[i][k - 1] : temp;
dist[i][k] = min + 1;
}
}
}
return dist[len1 - 1][len2 - 1];
}
}