首页 > 其他 > 详细

Edit Distance

时间:2017-08-05 20:58:52      阅读:168      评论:0      收藏:0      [点我收藏+]
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

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

技术分享

res[i][j]表示Edit Distance between X数组的前i个元素以及Y数组的前j个元素,或者the minimum # of operations to convert X前i个元素 into Y的前j个元素

因为对于Xi 和 Yj,操作无非是 insert, delete, replace三种,所以递归式就是三项:根据上面这个图很清楚:res[i][j] = min{res[i-1][j]+1, res[i][j-1]+1, Xi == Yj ? res[i-1][j-1] : res[i-1][j-1] + 1}

public int minDistance(String word1, String word2) {
        // write your code here
        // state
        int m = word1.length(), n = word2.length();
        /*if (word1 == null || word2 == null || )*/
        int[][] f = new int[m + 1][n + 1];
        // initialize
        f[0][0] = 0;
        for (int i = 1; i <= m; i++) {
            f[i][0] = i;
        }
         for (int i = 1; i <= n; i++) {
            f[0][i] = i;
        }
        
        // function
         for (int i = 1; i <= m; i++) {
            for (int j = 1; j <= n; j++) {
                if (word1.charAt(i - 1) == word2.charAt(j - 1)) {
                    f[i][j] = /*f[i - 1][j - 1]*/ Math.min(f[i - 1][j - 1], Math.min(f[i - 1][j] + 1, f[i][j - 1] + 1));
                } else {
                     f[i][j] = Math.min(f[i - 1][j - 1] + 1, Math.min(f[i - 1][j] + 1, f[i][j - 1] + 1));
                }
            }
        }
        return f[m][n];
    }

写好状态后, 想想与上一个状态怎么用题意联系起来, 上一个状态常常是遍历的上一个状态, 字符串问题常常要考虑上一个字母是否匹配来分情况讨论

 

Edit Distance

原文:http://www.cnblogs.com/apanda009/p/7291363.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!