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];
    }
}
时间: 2024-10-23 02:55:16

lintcode-medium-Edit Distance的相关文章

(分类讨论, 情景模拟) lintcode 640. One Edit Distance, leetcode 388,intcode 645. 13. 12. 659. 660

找特殊情况,分类讨论:三种情况 1)两个字符串的长度之差 大于1 直接返回false: 2)长度之差等于1, 判断长的字符串删掉不一样的字符,剩余的字符串是否相同: 3)长度之差等于0,判断不相同的字符个数,若超过一个返回false. class Solution { public: /** * @param s: a string * @param t: a string * @return: true if they are both one edit distance apart or f

[LintCode] 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: Insert a character Delete a character

【LeetCode】161. One Edit Distance

Difficulty: Medium  More:[目录]LeetCode Java实现 Description Given two strings S and T, determine if they are both one edit distance apart. Intuition 同时遍历比较S和T的字符,直至遇到不同的字符:如果S和T的字符个数相同时,跳过不同的那个字符,继续遍历:如果S和T的字符个数相差为1时,跳过较长的字符串的当天字符,继续遍历.如果剩下的字符都相等,那么返回tr

[Locked] One Edit Distance

One Edit Distance Given two strings S and T, determine if they are both one edit distance apart. 分析: 编辑距离复杂度为O(MN),而本题显然不能用这么高的复杂度:首先,可以通过判断两个字符串是否等长来决定用增一位.减一位.替换一位这三种方法之一来使得两个字符串等同,如果都不行,就return false:然后同时遍历S和T,第一次遇到不匹配的,就用刚才判断出的方法拯救一下:第二次还遇到不匹配的,就

[LeetCode] One Edit Distance 一个编辑距离

Given two strings S and T, determine if they are both one edit distance apart. 这道题是之前那道Edit Distance的拓展,然而这道题并没有那道题难,这道题只让我们判断两个字符串的编辑距离是否为1,那么我们只需分下列三种情况来考虑就行了: 1. 两个字符串的长度之差大于1,那么直接返回False 2. 两个字符串的长度之差等于1,那么长的那个字符串去掉一个字符,剩下的应该和短的字符串相同 3. 两个字符串的长度之

leetcode day4 -- Binary Tree Postorder(Preorder) Traversal &amp;&amp; Edit Distance

 1.Binary Tree Postorder Traversal Given a binary tree, return the postorder traversal of its nodes' values. For example: Given binary tree {1,#,2,3}, 1 2 / 3 return [3,2,1]. Note: Recursive solution is trivial, could you do it iteratively? 分析:后续遍历

【leetcode】Edit Distance 详解

下图为TI C6xx DSP Nyquist总线拓扑图,总线连接了master与slave,提供了高速的数据传输.有很多种速率不同的总线,如图中的红色方框,最高速总线为CPU/2 TeraNet SCR(即VBUSM SCR),带宽为256bit,其他低速总线为CPU/3,CPU/6,带宽参考图中所示.总线之间用Bridge(桥)连接,作用包括转换总线的速率,使之与所流向总线的速率相同等. 在具体应用中,各种速率的总线完全可以满足复杂的数据传输,而数据传输的瓶颈往往在于连接总线之间的Bridge

leetcode 161. One Edit Distance 判断两个字符串是否是一步变换 --------- java

Given two strings S and T, determine if they are both one edit distance apart. 给定两个字符串,判断他们是否是一步变换得到的. 在这里需要注意几点: 1.不等于1的变换都要返回false(包括变换次数等于0). 2.还有很多细节需要注意. 方法如下: 1.直接判断:1)如果差值大于1,直接返回false.  2)如果长度相同,那么依次判断,是否只有一个字母不一样.  3)如果不一样,那么看是否是只是多出了一个字母. p

LeetCode One Edit Distance

原题链接在这里:https://leetcode.com/problems/one-edit-distance/ Given two strings S and T, determine if they are both one edit distance apart. 与Edit Distance类似. 若是长度相差大于1, return false. 若是长度相差等于1, 遇到不同char时, 长的那个向后挪一位. 若是长度相等, 遇到不同char时同时向后挪一位. 出了loop还没有返回,

161. One Edit Distance

题目: Given two strings S and T, determine if they are both one edit distance apart. 链接: http://leetcode.com/problems/one-edit-distance/ 6/14/2017 2ms, 58% 提交好几次才通过,所以代码像打补丁一样.注意的test case: 2个空string -- false 相同的string -- false 当检查出来不一致时,根据长度来比较之后的subs