首页 > 代码库 > Edit Distance
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
题意:最短编辑距离问题,之前在July大神的编程艺术上也见到过这道题目,据说还是谷歌的面试题来着,还蛮有意思的。题意大致就是将一个字符串编辑成另外一个字符串。可以通过一下三种操作。
1)插入一个字符
2)删除一个字符
3)替换掉一个字符
求解最小的操作步骤将其中的一个字符串编辑成另外一个字符串。最直观的解题思路是动态规划。
假定edit(i,j)表示字符串长度分别为i,j的字符串最小编辑距离。
容易归纳出一下的动态规划方程:
1) if i == 0 且 j == 0,edit(i, j) = 0
2)if i == 0 且 j > 0,edit(i, j) = j
3)if i > 0 且j == 0,edit(i, j) = i
4) if i ≥ 1 且 j ≥ 1 ,edit(i, j) == min{ edit(i-1, j) + 1, edit(i, j-1) + 1, edit(i-1, j-1) + f(i, j) }, 当第一个字符串的第i个字符不等于第二个字符串的第j个字符时,f(i, j) =1;否则,f(i, j) = 0。
如此很容易写出相应代码:
public static int minDistance(String word1, String word2) { int max1 = word1.length(); int max2 = word2.length(); int[][] dis = new int[max1 + 1][max2 + 1]; for (int i = 0; i < max1 + 1; i++) { dis[i][0] = i; } for (int i = 0; i < max2 + 1; i++) { dis[0][i] = i; } for (int i = 1; i < max1 + 1; i++) { for (int j = 1; j < max2 + 1; j++) { int d = 0; int temp = Math.min(dis[i - 1][j] + 1, dis[i][j - 1] + 1); if (word1.charAt(i-1) == word2.charAt(j-1)) { d = 0; } else { d = 1; } dis[i][j] = Math.min(temp, dis[i - 1][j - 1] + d); } } int res = dis[max1][max2]; return res; }
Edit Distance