题目
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
解析
//使用一维数组
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
if (word1.equals("")) {
return n;
} else if (word2.equals("")) {
return m;
}
char[] c1 = word1.toCharArray();
char[] c2 = word2.toCharArray();
int[] cur = new int[m+1];
//只保留一列
for (int i = 1; i <= m; i++) {
cur[i] = i;
}
for (int j = 1; j <= n; j++) {
int pre = cur[0];
//cur[0]更新
cur[0] = j;
for (int i = 1; i <= m; i++) {
int tmp = cur[i];
if (c1[i-1] == c2[j-1]) {
cur[i] = pre;
} else {
cur[i] = min(pre + 1, cur[i-1] + 1, cur[i] + 1);
}
pre = tmp;
}
}
return cur[m];
}
public int min(int a, int b, int c) {
return Math.min(Math.min(a,b), c);
}
}
//使用二维数组
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
if (word1.equals("")) {
return n;
} else if (word2.equals("")) {
return m;
}
char[] c1 = word1.toCharArray();
char[] c2 = word2.toCharArray();
int[][] dp = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) {
dp[i][0] = i;
}
for (int j = 0; j <= n; j++) {
dp[0][j] = j;
}
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (c1[i - 1] == c2[j - 1]) {
dp[i][j] = dp[i-1][j-1];
} else {
dp[i][j] = min(dp[i-1][j-1] + 1, dp[i-1][j] + 1,
dp[i][j-1] + 1);
}
}
}
return dp[m][n];
}
public int min(int a, int b, int c) {
return Math.min(Math.min(a,b), c);
}
}