编辑距离
时间:2022-07-22
本文章向大家介绍编辑距离,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
问题描述
给你两个单词 word1 和 word2,请你计算出将 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')
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/edit-distance
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。
递归方案
我们可以从两个单词的最后一个字母开始比较,两单词的最后一个字母分别记做word1[i], word2[j]。
若word1[i] 等于word2[j],i 、 j 前移 ,只需比较他们之前的元素 word1[i - 1], word[j - 1]情况;
不相等时有以下三种解决策略:
1)将word2[j]插入到word1[i]之后,只用判断word1[ i ] 和 word2[ j - 1 ]的情况
2)将word1[i]删除了,只用考虑word1[ i - 1] 和 word2[ j ]的情况
3)将word1[i]替换为word2[j], 后续只用考虑word1[i - 1] 和 word2[j - 1]情况
定义fun(i,j)表示word1前 i - 1个元素转化为 word2的前j - 1个元素所需的最少操作次数。
不相等时选择三种修改中操作数最少的那个,实现代码如下:
class Solution {
public int minDistance(String word1, String word2) {
return fun(word1.length() - 1, word2.length() - 1, word1, word2);
}
public int fun(int i, int j, String word1, String word2){
if(i == -1){
return j + 1;
}
if(j == -1){
return i + 1;
}
if(word1.charAt(i) == word2.charAt(j)){
return fun(i - 1, j - 1, word1, word2);
}
return Math.min(fun(i, j - 1, word1, word2),
Math.min(fun(i - 1, j, word1, word2), fun(i - 1, j - 1, word1, word2) ) ) + 1;
}
}
动态规划
递归方案超时了,改动态规划咯。
我们由递归方案可以得到,其转移函数与低归方案相同,此外我们dp[i] [j]的取值只依赖其上边,左边,左上三个位置的值。因此我们可以依次从上至下,从左至右填表。
为了简化baseline,定义二维整型数组dp,dp[i] [j] 表示word1前 i 个元素转化为 word2的前j 个元素所需的最少操作次数。baseline如下:
转移方程如下:
实现代码如下:
class Solution {
public int minDistance(String word1, String word2) {
int m = word1.length(), n = word2.length();
int[][] dp = new int[m + 1][n + 1];
for(int i = 0; i <= m; i++){
dp[i][0] = i;
}
for(int j = 0; j <= n; j++){
dp[0][j] = j;
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= n; j++){
if(word1.charAt(i - 1) == word2.charAt(j - 1)){
dp[i][j] = dp[i - 1][j - 1];
}else{
dp[i][j] = Math.min(dp[i - 1][j],
Math.min(dp[i][j - 1], dp[i - 1][j - 1])) + 1;
}
}
}
return dp[m][n];
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- SAP ABAP和Java的动态代理实现
- SAP ABAP CGLIB(Code Generation Library)的模拟实现
- 如何监听SAP CRM BOR事件
- 如何避免SAP订单保存后生成的中间件CSA inbound queue
- Java和ABAP单例(singleton)设计模式的攻与防
- JUnit 注解@SuiteClasses的工作原理
- 使用SAP CRM Mock framework进行单元测试
- ABAP Debugging Script(调试器脚本)使用的一些实际例子
- MySQL 8.0新特性 — 事务性数据字典与原子DDL
- Python基础之面向对象-继承
- [源码分析]ArrayList和LinkedList如何实现的?我看你还有机会!
- 使用Python实现平台自动打卡
- QT学习第4天:qt点击鼠标画一条直线(附源代码和程序)
- 跨站请求伪造——CSRF
- 13-6 编辑多个文件和保存