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 103 104
| import java.util.HashMap; import java.util.Map;
public class _72编辑距离 {
public int minDistance_dynamic_single(String word1, String word2) { if (word1.equals(word2)) { return 0; } int m = word1.length(), n = word2.length(); int[] dp = new int[n + 1]; char[] chars1 = word1.toCharArray(); char[] chars2 = word2.toCharArray(); for (int i = 1; i <= n; i++) { dp[i] = i; } for (int i = 0; i < m; i++) { int pre = dp[0]++; for (int j = 0; j < n; j++) { int tmp = dp[j + 1]; if (chars1[i] == chars2[j]) { dp[j + 1] = pre; } else { dp[j + 1] = Math.min(Math.min(dp[j + 1], dp[j]), pre) + 1; } pre = tmp; } } return dp[n]; }
public int minDistance_dynamic(String word1, String word2) { int x = word1.length(); int y = word2.length(); int[][] dp = new int[x+1][y+1]; for (int i = 0; i <= x; i++) { dp[i][0] = i; } for (int i = 0; i <= y; i++) { dp[0][i] = i; }
for (int i = 0; i < word1.length(); i++) { for (int j = 0; j < word2.length(); j++) { if(word1.charAt(i) == word2.charAt(j)){ dp[i+1][j+1] = dp[i][j]; }else { dp[i+1][j+1] = Math.min( Math.min( dp[i][j+1], dp[i+1][j] ), dp[i][j] ) + 1; } } } return dp[x][y]; }
public int minDistance(String word1, String word2) { String s1 = word1 + "-" + word2; if (map.containsKey(s1)) { return map.get(s1); }
if (word1.isEmpty() || word2.isEmpty()) { int max = Math.max(word1.length(), word2.length()); map.put(s1, max); return max; } if (word1.charAt(0) == word2.charAt(0)) { int sameInt = minDistance(word1.substring(1), word2.substring(1)); map.put(s1, sameInt); return sameInt; }
int min = Math.min( Math.min( minDistance(word1.substring(1), word2), minDistance(word1, word2.substring(1)) ), minDistance(word1.substring(1), word2.substring(1)) ) + 1; map.put(s1, min); return min; }
private Map<String, Integer> map = new HashMap<>();
public static void main(String[] args) { _72编辑距离 editDistance = new _72编辑距离();
System.out.println(editDistance.minDistance_dynamic("intention", "execution")); }
}
|