-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy path072_EditDistance72.java
102 lines (84 loc) · 2.87 KB
/
072_EditDistance72.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
/**
* 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
*/
import java.util.Arrays;
public class EditDistance72 {
// time: O(mn); space: O(mn)
public int minDistance(String word1, String word2) {
int m = word1.length();
int n = word2.length();
int[][] d = new int[m + 1][n + 1];
for (int i = 0; i <= m; i++) d[i][0] = i;
for (int i = 1; i <= n; i++) d[0][i] = i;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
if (word1.charAt(i-1) == word2.charAt(j-1)) {
d[i][j] = d[i-1][j-1];
} else {
d[i][j] = Math.min(d[i-1][j], d[i][j-1]) + 1;
d[i][j] = Math.min(d[i][j], d[i-1][j-1] + 1);
}
}
}
return d[m][n];
}
// time: O(mn); space: O(n)
public int minDistance2(String word1, String word2) {
int m = word1.length();
int n = word2.length();
if (n == 0) {
return m;
}
int[] d = new int[n + 1];
for (int j = 0; j <= n; j++)
d[j] = j;
for (int i = 1; i <= m; i++) {
int last = d[0];
for (int j = 1; j <= n; j++) {
int saveLast = d[j];
d[0] = i;
if (word1.charAt(i-1) == word2.charAt(j-1)) {
d[j] = last;
} else {
d[j] = Math.min(d[j], d[j-1]) + 1;
d[j] = Math.min(d[j], last + 1);
}
last = saveLast;
}
}
return d[n];
}
public int minDistance3(String word1, String word2) {
int len1 = word1.length();
int len2 = word2.length();
if (len1 == 0) return len2;
if (len2 == 0) return len1;
int[] dp = new int[len2+1];
for (int j=0; j<=len2; j++) dp[j] = j;
for (int i=1; i<=len1; i++) {
int pre = dp[0];
dp[0] = i;
for (int j=1; j<=len2; j++) {
int nextPre = dp[j];
dp[j] = Math.min(pre + (word1.charAt(i-1) == word2.charAt(j-1) ? 0 : 1),
Math.min(dp[j], dp[j-1]) + 1);
pre = nextPre;
}
}
return dp[len2];
}
public static void main(String[] args) {
EditDistance72 ed = new EditDistance72();
System.out.println(ed.minDistance2("word1", "word3"));
System.out.println(ed.minDistance2("aaabbb", "aababb"));
System.out.println(ed.minDistance2("b", ""));
System.out.println(ed.minDistance2("", "b"));
}
}