码迷,mamicode.com
首页 > 其他好文 > 详细

Edit Distance

时间:2017-08-05 21:15:30      阅读:124      评论:0      收藏:0      [点我收藏+]

标签:mit   word   根据   ted   stat   min   状态   write   null   

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

标签:mit   word   根据   ted   stat   min   状态   write   null   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!