【每日算法Day 92】经典面试题:编辑距离

简介: 给你两个单词 word1 和 word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。你可以对一个单词进行如下三种操作:• 插入一个字符• 删除一个字符• 替换一个字符

题目描述


给你两个单词 word1word2,请你计算出将 word1 转换成 word2 所使用的最少操作数 。

你可以对一个单词进行如下三种操作:

  • 插入一个字符
  • 删除一个字符
  • 替换一个字符

示例1

输入:word1 = "horse", word2 = "ros"输出:3解释:horse -> rorse (将 'h' 替换为 'r')rorse -> rose (删除 'r')rose -> ros (删除 'e')

示例2

输入:word1="intention", word2="execution"输出:5解释:intention->inention (删除't')inention->enention ('i'替换为'e')enention->exention ('n'替换为'x')exention->exection ('n'替换为'c')exection->execution (插入'u')

题解



image.png

image.png

代码


c++

classSolution {
public:  
intminDistance(stringword1, stringword2) {  
intn=word1.size(), m=word2.size();       
vector<vector<int>>dp(n+1, vector<int>(m+1, INT_MAX));  
dp[0][0] =0;       
for (inti=0; i<m; ++i) dp[0][i+1] =i+1;  
for (inti=0; i<n; ++i) dp[i+1][0] =i+1;  
for (inti=0; i<n; ++i) {     
for (intj=0; j<m; ++j) {    
if (word1[i] ==word2[j]) {   
dp[i+1][j+1] =dp[i][j];    
continue;           
                }            
// 插入        dp[i+1][j+1] =min(dp[i+1][j+1], dp[i+1][j]+1);   
// 删除        dp[i+1][j+1] =min(dp[i+1][j+1], dp[i][j+1]+1);
// 替换  dp[i+1][j+1] =min(dp[i+1][j+1], dp[i][j]+1);            }     
        }      
returndp[n][m];  
    }
};

python

classSolution: 
defminDistance(self, word1: str, word2: str) ->int:  
n, m=len(word1), len(word2)   
dp= [[0]*(m+1) for_inrange(n+1)]   
dp[0] = [iforiinrange(m+1)]   
foriinrange(n+1): dp[i][0] =iforiinrange(n):    
forjinrange(m):    
ifword1[i] ==word2[j]: 
dp[i+1][j+1] =dp[i][j]    
continuedp[i+1][j+1] =min(dp[i+1][j], dp[i][j+1], 
dp[i][j]) +1returndp[n][m]

关注【算法码上来】,每日算法干货马上就来!

参考资料


[1]

LeetCode 72. 编辑距离: https://leetcode-cn.com/problems/edit-distance/

image.png

作者简介:godweiyang知乎同名华东师范大学计算机系硕士在读,方向自然语言处理与深度学习喜欢与人分享技术与知识,期待与你的进一步交流~


相关文章
|
3天前
|
存储 算法 编译器
米哈游面试算法题:有效的括号
米哈游面试算法题:有效的括号
28 0
|
3天前
|
开发框架 算法 搜索推荐
C# .NET面试系列九:常见的算法
#### 1. 求质数 ```c# // 判断一个数是否为质数的方法 public static bool IsPrime(int number) { if (number < 2) { return false; } for (int i = 2; i <= Math.Sqrt(number); i++) { if (number % i == 0) { return false; } } return true; } class Progr
64 1
|
3天前
|
负载均衡 算法 应用服务中间件
面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
字节跳动面试题:Nginx有哪些负载均衡算法?Nginx位于七层网络结构中的哪一层?
49 0
|
1天前
|
算法 前端开发 Android开发
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
Android文字基线Baseline算法的使用讲解,Android开发面试题
|
1天前
|
算法 Java API
Groovy脚本基础全攻略,android面试算法题
Groovy脚本基础全攻略,android面试算法题
|
1天前
|
NoSQL 算法 Java
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
【redis源码学习】持久化机制,java程序员面试算法宝典pdf
|
1天前
|
算法 架构师 网络协议
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
对标腾讯T9架构师的 Android 面试题新鲜出炉,算法真的太重要了
|
2天前
|
移动开发 算法 搜索推荐
2024最新Android算法相关面试大全,请查收
2024最新Android算法相关面试大全,请查收
|
3天前
|
存储 缓存 算法
面试遇到算法题:实现LRU缓存
V哥的这个实现的关键在于维护一个双向链表,它可以帮助我们快速地访问、更新和删除最近最少使用的节点,同时使用哈希表来提供快速的查找能力。这样,我们就可以在 O(1) 的时间复杂度内完成所有的缓存操作。哈哈干净利索,回答完毕。
|
3天前
|
算法 搜索推荐 Python
数据结构与算法在Python面试中的应用实例
【4月更文挑战第13天】本文聚焦Python面试中的数据结构与算法问题,包括排序算法、链表操作和树图遍历。重点讨论了快速排序、链表反转和二叉树前序遍历的实现,并指出理解算法原理、处理边界条件及递归操作是避免错误的关键。通过实例代码和技巧分享,帮助面试者提升面试表现。
13 0