题目:

Given two words word1 and word2, find the minimum number of operations required to convert word1 to word2.

You have the following 3 operations permitted on a word:

  1. Insert a character
  2. Delete a character
  3. Replace a character

Example 1:

Input: word1 = "horse", word2 = "ros"
Output: 3
Explanation:
horse -> rorse (replace 'h' with 'r')
rorse -> rose (remove 'r')
rose -> ros (remove 'e')

Example 2:

Input: word1 = "intention", word2 = "execution"
Output: 5
Explanation:
intention -> inention (remove 't')
inention -> enention (replace 'i' with 'e')
enention -> exention (replace 'n' with 'x')
exention -> exection (replace 'n' with 'c')
exection -> execution (insert 'u')

分析:

给定两个单词,求word1转换到word2需要的最少步骤,转换的操作有三种,分别是插入一个字符,删除一个字符,替换一个字符。

d(word1, word2)用来求两个单词转换的需要的最小步数,那么如果当两个单词的最后一个字符是相同的,则d(word1, word2) = d(word1', word2')其word1'和word2'是分别去掉最后一个字符的单词。

如果最后两个字符不相同时,我们就需要操作来进行转换,一种是在word1后增加一个字符,是其最后一个字符和word2的最后一个字符相同,一种是删去word1的最后一个字符,一种是将word1的最后一个字符转换成word2的最后一个字符,那么此时最小的步数就是前三个操作的最小值加上1.

可能有同学会问为什么不在word2上进行操作,实际上操作转换这一步是有5个子问题的,但实际上在word1后增加一个字符和word2最后字符相同,相当于在word2后删除字符;删去word1的字符相当于在word2后增加一个字符和word1最后字符相同;而转换操作明显是一样的,所以就合并成为了三个子问题。

当递归执行到其中一个串为空串时,则加上另一个串的长度即可,相当于删去所有的字符。

程序:

C++

class Solution {
public:
int minDistance(string word1, string word2) {
int l1 = word1.length();
int l2 = word2.length();
dp = vector<vector<int>>(l1+1, vector<int>(l2+1, -1));
return minDistance(word1, word2, l1, l2);
}
private:
vector<vector<int>> dp;
int minDistance(string& word1, string& word2, int l1, int l2){
if(l1 == 0)
return l2;
if(l2 == 0)
return l1;
if(dp[l1][l2] >= 0)
return dp[l1][l2];
int res = 0;
if(word1[l1-1] == word2[l2-1]){
res = minDistance(word1, word2, l1-1, l2-1);
dp[l1][l2] = res;
return res;
}
res = min(minDistance(word1, word2, l1-1, l2),
min(minDistance(word1, word2, l1, l2-1),
minDistance(word1, word2, l1-1, l2-1))) + 1;
dp[l1][l2] = res;
return res;
}
};

Java

class Solution {
public int minDistance(String word1, String word2) {
int l1 = word1.length();
int l2 = word2.length();
dp = new int[l1+1][l2+1];
for(int i = 0; i < dp.length; ++i){
for(int j = 0; j < dp[i].length; ++j){
dp[i][j] = -1;
}
}
return minDistance(word1, word2, l1, l2);
}
private int minDistance(String word1, String word2, int l1, int l2){
if(l1 == 0) return l2;
if(l2 == 0) return l1;
if(dp[l1][l2] >= 0)
return dp[l1][l2];
int res = 0;
if(word1.charAt(l1-1) == word2.charAt(l2-1)){
res = minDistance(word1, word2, l1-1, l2-1);
}else{
res = Math.min(minDistance(word1, word2, l1-1, l2),
Math.min(minDistance(word1, word2, l1, l2-1),
minDistance(word1, word2, l1-1, l2-1))) + 1;
}
dp[l1][l2] = res;
return res;
}
private int[][] dp;
}

LeetCode 72. Edit Distance 编辑距离 (C++/Java)的更多相关文章

  1. [LeetCode] 72. Edit Distance 编辑距离

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to  ...

  2. leetCode 72.Edit Distance (编辑距离) 解题思路和方法

    Edit Distance Given two words word1 and word2, find the minimum number of steps required to convert  ...

  3. [LeetCode] 72. Edit Distance(最短编辑距离)

    传送门 Description Given two words word1 and word2, find the minimum number of steps required to conver ...

  4. 【LeetCode】72. Edit Distance 编辑距离(Python & C++)

    作者: 负雪明烛 id: fuxuemingzhu 个人博客: http://fuxuemingzhu.cn/ 目录 题目描述 题目大意 解题方法 递归 记忆化搜索 动态规划 日期 题目地址:http ...

  5. LeetCode - 72. Edit Distance

    最小编辑距离,动态规划经典题. Given two words word1 and word2, find the minimum number of steps required to conver ...

  6. [leetcode]72. Edit Distance 最少编辑步数

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to ...

  7. 72. Edit Distance(编辑距离 动态规划)

    Given two words word1 and word2, find the minimum number of operations required to convert word1 to  ...

  8. 第十八周 Leetcode 72. Edit Distance(HARD) O(N^2)DP

    Leetcode72 看起来比较棘手的一道题(列DP方程还是要大胆猜想..) DP方程该怎么列呢? dp[i][j]表示字符串a[0....i-1]转化为b[0....j-1]的最少距离 转移方程分三 ...

  9. [leetcode] 72. Edit Distance (hard)

    原题 dp 利用二维数组dp[i][j]存储状态: 从字符串A的0~i位子字符串 到 字符串B的0~j位子字符串,最少需要几步.(每一次删增改都算1步) 所以可得边界状态dp[i][0]=i,dp[0 ...

  10. 【Leetcode】72 Edit Distance

    72. Edit Distance Given two words word1 and word2, find the minimum number of steps required to conv ...

随机推荐

  1. 07cj031,07CJ03-1图集免费下载

    简介 07CJ03-1轻钢龙骨石膏板隔墙.吊顶图集是中国建筑标准设计研究院组织编写的一部针对轻钢龙骨.石膏板材料用于非承重隔墙.室内吊顶装修的装修.建造参考资料,为用户提供专业的建造参考 下载 有需要 ...

  2. Databricks 企业版 Spark&Delta Lake 引擎助力 Lakehouse 高效访问

    ​简介:本文介绍了Databricks企业版Delta Lake的性能优势,借助这些特性能够大幅提升Spark SQL的查询性能,加快Delta表的查询速度. 作者: 李锦桂(锦犀) 阿里云开源大数据 ...

  3. [FAQ] Vue 如何控制标签元素的某个属性的显示 ?

    这需要借助 v-model 的用法,动态决定元素的展示. <q-btn :disable="2 > 1">按钮</q-btn> 展示结果是:<q ...

  4. [MySQL] 导入数据库和表的两种方式

    如果是导入 mysqldump 导出的 sql 文件,使用 mysql 命令再导入就可以了. 下面是另一种可选方式: use xxdb source /var/lib/mysql/xxtable.sq ...

  5. dotnet 读 WPF 源代码笔记 WPF 是如何做到一套代码兼容多个 .NET Framework 版本

    在 .NET Framework 时代里面,有一组有趣的概念,那就是 SDK 和 Runtime 这两个概念.开发模式十分有趣,在开发者设备上,可以指定 .NET Framework 的 SDK 版本 ...

  6. dotnet Microsoft.Recognizers.Text 超强大的自然语言关键词提取库

    本文和大家介绍一个使用超级简单,但是功能特别强大的自然语言关键词提取库,可以根据输入的自然语言提取出里面的信息.例如我在一句话里面说了哪些数值变量或者说了手机号码等 先看看下图的一个效果,下图是尝试识 ...

  7. STM32的半主机与MicroLIB机制

    一.半主机模式 半主机机制的作用 半主机是作用于ARM目标的一种机制,可以将来自STM32单片机应用程序的输入与输出请求传送至运行仿真器的PC主机上.使用此机制可以启用C库中的函数,如printf() ...

  8. Oracle【ORA-00600 internal error code arguments [2662]】恢复一例

    背景 1.数据库版本:11.2.0.4 2.未开启归档 3.没有备份:无RMAN备份.无DUMP备份 4.数据库redo log全部删除. 解决思路: Oracle 的隐含参数: _allow_res ...

  9. LocalDateTime 时间偏移量的处理

    一.代码处理块 // 当前系统时间两年后的时间 LocalDateTime expirationTime = LocalDateTimeUtil.offset(LocalDateTime.now(), ...

  10. 4G EPS 的架构模型

    目录 文章目录 目录 前文列表 EPS 的架构 EPS 的架构模型 E-UTRAN UE eNodeB EPC MME(移动性管理) SGW(本地移动性锚点) PGW(业务锚点) HSS(用户认证及鉴 ...