您的位置:首页 > 其它

lintcode-medium-Edit Distance

2016-03-20 13:44 330 查看
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:

Insert a character

Delete a character

Replace a character

Given word1 =
"mart"
and word2 =
"karma"
, return
3
.

动态规划,用一个二维int数组记录word1中前i个字符到word2中前j个字符的edit distance:

如果word1中的第i-1个字符和word2中第j-1个字符相等,说明这个edit distance和word1前i-1个字符到word2前j-1个字符的edit distance相等

如果这两个字符不相等,这时有三种选择:

1. 修改:把word1最后一个字符改为word2最后一个字符,edit distance为dp[i - 1][j - 1] + 1

2. word1增加一个字符:在word1前i-1个字符中加入一个字符,edit distance为dp[i - 1][j] + 1

3. word2增加一个字符:在word2前j-1个字符中加入一个字符,edit distance为dp[i][j - 1] + 1

选取其中最小的一个作为dp[i][j]

public class Solution {
/**
* @param word1 & word2: Two string.
* @return: The minimum number of steps.
*/
public int minDistance(String word1, String word2) {
// write your code here

if(word1 == null || word1.length() == 0)
return word2.length();
if(word2 == null || word2.length() == 0)
return word1.length();

int m = word1.length();
int n = word2.length();

int[][] dp = new int[m + 1][n + 1];

for(int i = 0; i <= m; i++)
dp[i][0] = i;
for(int i = 0; i <= n; i++)
dp[0][i] = i;

for(int i = 1; i <= m; i++){
char c1 = word1.charAt(i - 1);

for(int j = 1; j <= n; j++){
char c2 = word2.charAt(j - 1);

if(c1 == c2){
dp[i][j] = dp[i - 1][j - 1];
}
else{
dp[i][j] = Math.min(dp[i - 1][j - 1], Math.min(dp[i - 1][j], dp[i][j - 1])) + 1;
}
}
}

return dp[m]
;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: