新博文地址:[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
You have the following 3 operations permitted on a word:
a) Insert a character
b) Delete a character
c) Replace a character
这道题在编程之美上有原题,书中给出的答案是用 递归版实现,代码如下:
public int minDistanceWithRecurse(String word1, String word2) { if(word1.length() == 0){ return word2.length(); } if(word2.length() == 0){ return word1.length(); } if(word1.charAt(0) == word2.charAt(0)){ return minDistance(word1.substring(1), word2.substring(1)); }else{ int t1 = minDistance(word1.substring(1), word2); int t2 = minDistance(word1, word2.substring(1)); int t3 = minDistance(word1.substring(1), word2.substring(1)); return Math.min(t1, Math.min(t2, t3)) + 1; } }
但是坑爹的超时了,后来想了一下,还是不会,google之,发现原来Edit Distance是自然语言处理中的很重要的一个算法,而且自成一脉。大家可以去看下维奇百科的解释,Edit Distance中明确的说明了这个问题用递归实现的复杂度是指数级的,因此,采用了DP解决思路:百科中已经讲得很明白了。这里就简单的小结一下:
维护一个二维矩阵来记录distance的状态:
dinstance[i][j]分别表示字符串word1[0~i]与word2[0~j]的距离
这里需要将distance开到[word1.length() +1][word2.length() + 1]
dinstance[i][j]分别表示字符串word1[0~i]与word2[0~j]的距离
这里需要将distance开到[word1.length() +1][word2.length() + 1]
其中[0][0]表示二者都为空串时,distance显然为0.
当i = 0时,distance[0][j] = j (其中 1 <= j <= word2.length()),同理
当j = 0时,distance[i][0] = i (其中 1 <= i <= word1.length())
当i = 0时,distance[0][j] = j (其中 1 <= j <= word2.length()),同理
当j = 0时,distance[i][0] = i (其中 1 <= i <= word1.length())
而distance[i][j]有两种情况
当word1.charAt(i) == word2.charAt(j)时,
显然distance[i][j] = distance[i-1][j - 1];
当word1.charAt(i) != word2.charAt(j)时,
需要考察distance[i - 1][j - 1]、 distance[i][j - 1]、distance[i - 1][j]分别对应了三种情况:修改word1[i] 为word2[j]、删除word2[j]、删除word1[i],找到这三者中最小的一个数 ,然后+ 1(表示删除操作或者修改操作)
当word1.charAt(i) == word2.charAt(j)时,
显然distance[i][j] = distance[i-1][j - 1];
当word1.charAt(i) != word2.charAt(j)时,
需要考察distance[i - 1][j - 1]、 distance[i][j - 1]、distance[i - 1][j]分别对应了三种情况:修改word1[i] 为word2[j]、删除word2[j]、删除word1[i],找到这三者中最小的一个数 ,然后+ 1(表示删除操作或者修改操作)
具体的还需要看这里:
代码如下:
public int minDistance(String word1, String word2) { int length1 = word1.length(); int length2 = word2.length(); if(length1 == 0 || length2 == 0){ return length1 == 0? length2: length1; } int[][] distance = new int[length1 + 1][length2 + 1]; distance[0][0] = 0; for(int i = 1; i <= length1; i++){ distance[i][0] = i ; } for(int i = 1; i <= length2; i++){ distance[0][i] = i ; } for(int i = 1; i <= length1; i++){ for(int j = 1; j <= length2; j++){ if(word1.charAt(i-1) == word2.charAt(j-1)){ distance[i][j] = distance[i - 1][j - 1]; }else{ distance[i][j] = Math.min(distance[i - 1][j - 1], Math.min(distance[i][j - 1], distance[i - 1][j])) + 1; } } } return distance[length1][length2]; }
相关推荐
python python_leetcode题解之072_Edit_Distance
c c语言_leetcode题解之0072_edit_distance.zip
python python_leetcode题解之161_One_Edit_Distance.py
javascript js_leetcode题解之第72-edit-distance.js
javascript js_leetcode题解之161-one-edit-distance.js
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 ...
14. One Edit Distance:判断两个字符串是否只差一个字符操作。 15. Read N Characters Given Read4:一次调用 read4() 可以读取 4 个字符,编写一个函数,使其能够读取 n 个字符。 16. Read N Characters Given ...
- Edit Distance: 给定两个单词word1和word2,计算将word1转换为word2所使用的最少操作数。 - Set Matrix Zeroes: 给定一个m×n的矩阵,如果一个元素为0,则将其所在行和列的所有元素都变为0。 - Search a 2D Matrix...
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 ...
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/...
在LeetCode的面试题目中,第72题“编辑距离”(Edit Distance)是一个经典的算法问题,它涉及到了字符串操作、动态规划和递归等编程概念。本题解将深入探讨这个问题的背景、解决方案以及Python实现。 ### 问题背景 ...
标题"**c++-c++编程基础之leetcode题解第72题编辑距离.zip**"指的是一个关于C++编程的学习资源,特别针对LeetCode网站上的第72题“编辑距离”(Edit Distance)的问题。LeetCode是一个在线平台,提供了各种算法题目...
在本压缩包中,我们关注的是一个Python编程与算法相关的面试题目,具体是LeetCode的第161题,名为“相隔为1的编辑距离”(Edit Distance)。这个题目在求职面试中常被用来测试候选人的编程能力,特别是对字符串操作...
编辑距离(Edit Distance)是一种衡量两个字符串相似度的算法,广泛应用于编程竞赛、文本处理、搜索引擎优化等领域。在LeetCode这个知名的在线编程挑战平台上,它是一个经典的算法问题。本资料包是关于使用PHP解决...
#### 十、One Edit Distance - **知识点:**动态规划、字符串比较。 - **题目描述:**给定两个字符串word1和word2,返回使word1和word2相同所需的最小步数。每步可以插入一个字符、删除一个字符或者替换一个字符。 -...
leetcode中国英文翻译正在进行中... 一些文章仍然是中文的,但大部分已经完成。 请为这个 repo 加注星标。 完整的翻译最终将完成。 享受。...这些文章讨论了不同类型的...Programming/EditDistance.md) 【经典DP:超级蛋
10. LeetCode第1081题:"One Edit Distance"(单编辑距离):判断两个字符串之间是否只需要一次编辑操作(插入、删除或替换)就可以互相转换。 11. LeetCode第1310题:"XOR Queries of a Subarray"(子数组异或查询...
"Edit Distance"(编辑距离)是动态规划的一个经典应用,通常用于计算两个字符串之间的最小操作次数,使得一个字符串转换成另一个。这些操作可能包括插入、删除和替换字符。"Regular Expression Matching"(正则...
EditDistance(#72) 图 : 集合的合并(直接求并、按大小求并和按深度求并)、根搜寻(路径压缩) : 有向图和无向图的邻接表表示方法 : 图的深度优先和广度优先搜索(假设图用邻接表矩阵表示)、拓扑排序、判断是否有环 ...
《算法导论》中的编辑距离(Edit Distance)是一个在计算机科学和信息处理中常见的概念,用于衡量两个字符串之间的差异。编辑距离定义为将一个字符串转换成另一个字符串所需的最少单字符编辑操作次数,这些操作包括...