首页 > 代码库 > 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