`
frank-liu
  • 浏览: 1683049 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

leetcode: 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:

a) Insert a character
b) Delete a character
c) Replace a character

原问题链接:https://leetcode.com/problems/edit-distance/

 

问题分析

  这是一个典型的动态规划方法应用的问题。这一类的问题相对来说都有一个递归最优解以及重复利用子问题解的特点。 我们先从问题的描述来找一下思路。

  对于问题来说,对于一个字符串转换成另外一个字符串,它可以有这么几种变换,一种是增加一个字符,一种是删除一个字符以及替换一个字符。这样的一个操作相当于对源字符串做了一次转换。如果对于两个相同的字符串来说,它们则没有任何转换。在这种情况下它的转换次数为0。而问题的目的是求得转换成目标串所需要的最小变换。

  对于源串word1来说,假设它的长度为m,如果要看它和目标穿word2(假设长度为n)的匹配程度,我们不仅需要看两个串最后面位置的字符,还要综合比较前面的所有情况。假设用函数P(i, j)表示对应于word1的i位置和word2的j位置是的转换数。

  • 当word1[m] == word2[n]的时候,这个时候我们发现一种转换方式,就是我们只需要去看word1[m - 1]和word2[n - 1]的匹配情况。因为这个时候它们最后的两个字符相同。相当于这种变换的值其实和P(m - 1, n - 1)相等。但是这种方式就是最少或者说最优的转换了吗?只怕未必。
  • 按照前面的描述,我们的的字符串变换有3种方式。那么在前面如果word[m]!= word[n]的时候呢?我们可以有一种变换就是替换一个字符。这个时候使得当前的字符相等,然后再把这个变换加到P(m - 1, n - 1)上。
  • 我们也还有一种可能就是删除一个字符,使得它们最终匹配。这个时候我们的变换就是在P(m - 1, n)的基础上加1。
  • 还有一种情况就是增加一个字符,这个时候的变换就是在P(m, n - 1)的基础上加1。

  针对上述的讨论,我们就得到了一个递归的关系。对于这个递归的关系里,不管是P(m - 1, n) , P(m, n - 1)还是P(m - 1, n - 1),它们又都满足上面的那个递归的属性。所以说它就是构成了一个动态规划解决的前提条件。

  从具体实现的角度来说,我们需要定义一个[m + 1][n + 1]的矩阵。第0行0列表示对于两个串来说都没有字符参与转换,所以它的值是0。而对于matrix[0][i]和matrix[i][0]来说,它所有的的变换就是对应的i值。因为这个时候相当于一方是从一个空的字符串转换成目标串,所以对应的变化就是i。这样就构成了一个递推的基本范围值。剩下具体的实现里就是按照每行每列的方式去考察p(i - 1, j) + 1, p(i, j - 1) + 1, p(i - 1, j - 1)或者p(i - 1, j - 1) + 1的值。取它们中间最小的那个作为部分最优解。最终的最佳整体结果值保存在matrix[m][n]中。

  详细的实现如下:

 

public class Solution {
    public int minDistance(String word1, String word2) {
        int m = word1.length();
        int n = word2.length();
        int[][] matrix = new int[m + 1][n + 1];
        for(int i = 0; i <= m; i++) matrix[i][0] = i;
        for(int i = 0; i <= n; i++) matrix[0][i] = i;
        for(int i = 1; i <= m; i++)
            for(int j = 1; j <= n; j++) {
                int temp = matrix[i - 1][j - 1] + ((word1.charAt(i - 1) == word2.charAt(j - 1)) ? 0 : 1);
                matrix[i][j] = Math.min(
                    Math.min(temp, matrix[i - 1][j] + 1),
                    matrix[i][j - 1] + 1
                );
            }
        return matrix[m][n];
    }
}
分享到:
评论

相关推荐

    leetcode分类-LeetCode:力码

    Distance Maximum Subarray Minimum Path Sum Unique Paths Unique Paths II Longest Palindromic Substring Interleaving String Triangle Distinct Subsequences Decode Ways Palindrome Partitioning II Maximal ...

    gasstationleetcode-leetcode:LeetcodeOJ解决方案

    leetcode 【演示记录】 报告 展示 2017/03/06 1.二和,167.二和二 2107/03/06 15.3 总和,16.3 总和最近,18.4 总和,11.最多水的容器 2017/03/09 62.Unique Paths, 63.Unique Paths II, 64.Minimum Path Sum 2017/...

    python-leetcode题解之072-Edit-Distance

    python python_leetcode题解之072_Edit_Distance

    c语言-leetcode题解之0072-edit-distance.zip

    c c语言_leetcode题解之0072_edit_distance.zip

    js-leetcode题解之第72-edit-distance.js

    javascript js_leetcode题解之第72-edit-distance.js

    python-leetcode题解之161-One-Edit-Distance.py

    python python_leetcode题解之161_One_Edit_Distance.py

    js-leetcode题解之161-one-edit-distance.js

    javascript js_leetcode题解之161-one-edit-distance.js

    LeetCode最全代码

    477 | [Total Hamming Distance](https://leetcode.com/problems/total-hamming-distance/) | [C++](./C++/total-hamming-distance.cpp) [Python](./Python/total-hamming-distance.py) | _O(n)_ | _O(1)_ | Medium ...

    Leetcode book刷题必备

    14. One Edit Distance:判断两个字符串是否只差一个字符操作。 15. Read N Characters Given Read4:一次调用 read4() 可以读取 4 个字符,编写一个函数,使其能够读取 n 个字符。 16. Read N Characters Given ...

    _leetcode-python.pdf

    - Edit Distance: 给定两个单词word1和word2,计算将word1转换为word2所使用的最少操作数。 - Set Matrix Zeroes: 给定一个m×n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都变为0。 - Search a 2D Matrix...

    leetcode中国-Algorithms:算法

    leetcode中国英文翻译正在进行中... 一些文章仍然是中文的,但大部分已经完成。 请为这个 repo 加注星标。 完整的翻译最终将完成。 享受。...这些文章讨论了不同类型的...Programming/EditDistance.md) 【经典DP:超级蛋

    leetcode316-algorithm-code-csharp:C#算法题汇总

    10. LeetCode第1081题:"One Edit Distance"(单编辑距离):判断两个字符串之间是否只需要一次编辑操作(插入、删除或替换)就可以互相转换。 11. LeetCode第1310题:"XOR Queries of a Subarray"(子数组异或查询...

    python-leetcode面试题解之第72题编辑距离.zip

    在LeetCode的面试题目中,第72题“编辑距离”(Edit Distance)是一个经典的算法问题,它涉及到了字符串操作、动态规划和递归等编程概念。本题解将深入探讨这个问题的背景、解决方案以及Python实现。 ### 问题背景 ...

    c++-c++编程基础之leetcode题解第72题编辑距离.zip

    标题"**c++-c++编程基础之leetcode题解第72题编辑距离.zip**"指的是一个关于C++编程的学习资源,特别针对LeetCode网站上的第72题“编辑距离”(Edit Distance)的问题。LeetCode是一个在线平台,提供了各种算法题目...

    python-leetcode面试题解之第161题相隔为1的编辑距离-题解.zip

    在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目,具体是LeetCode的第161题,名为“相隔为1的编辑距离”(Edit Distance)。这个题目在求职面试中常被用来测试候选人的编程能力,特别是对字符串操作...

    uber leetcode

    #### 十、One Edit Distance - **知识点:**动态规划、字符串比较。 - **题目描述:**给定两个字符串word1和word2,返回使word1和word2相同所需的最小步数。每步可以插入一个字符、删除一个字符或者替换一个字符。 -...

    php-leetcode题解之编辑距离.zip

    编辑距离(Edit Distance)是一种衡量两个字符串相似度的算法,广泛应用于编程竞赛、文本处理、搜索引擎优化等领域。在LeetCode这个知名的在线编程挑战平台上,它是一个经典的算法问题。本资料包是关于使用PHP解决...

    LeetCode判断字符串是否循环-data-structure-and-algo:C++中的数据结构和算法

    EditDistance(#72) 图 : 集合的合并(直接求并、按大小求并和按深度求并)、根搜寻(路径压缩) : 有向图和无向图的邻接表表示方法 : 图的深度优先和广度优先搜索(假设图用邻接表矩阵表示)、拓扑排序、判断是否有环 ...

    leetcode正则表达式-DP-7:DP-7

    "Edit Distance"(编辑距离)是动态规划的一个经典应用,通常用于计算两个字符串之间的最小操作次数,使得一个字符串转换成另一个。这些操作可能包括插入、删除和替换字符。"Regular Expression Matching"(正则...

    常见算法题答案及解析

    14. One Edit Distance:判断两个字符串是否相差一个字符,通常用来判断是否为编辑距离为一的字符串。 15. Read N Characters Given Read4:使用API读取文件中的N个字符,解决读取溢出问题。 16. Read N Characters ...

Global site tag (gtag.js) - Google Analytics