lintcode-medium-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:

  • 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][n];
    }
}

 

posted @ 2016-03-20 13:44  哥布林工程师  阅读(183)  评论(0编辑  收藏  举报