
leetcode — edit-distance
发布日期:2025-04-05 01:56:40
浏览次数:9
分类:精选文章
本文共 2133 字,大约阅读时间需要 7 分钟。
如何计算字符串的最短编辑距离?
当我们面对将一个字符串转换为另一个字符串的任务时,很可能会需要插入、删除或替换字符。为了找到最有效率的转换方法,我们可以使用动态规划来解决这个问题。
动态规划方法的工作原理
问题分析:我们需要将两个字符串转换为什么样可以用最少的步骤。每一步操作可以是插入、删除或替换,这一步的影响取决于两个字符串的当前字符是否匹配。
状态定义:定义 dp[i][j]
表示将前 i
个字符变为前 j
个字符所需的最小步骤数。当 i
或 j
为 0 时,只能通过插入或删除字符来填充。
递推关系:
- 如果当前字符相同
s1[i-1] == s2[j-1]
,那么dp[i][j] = dp[i-1][j-1]
,因为我们不需要任何操作。 - 如果字符不相同,则
dp[i][j] = min(dp[i-1][j], dp[i][j-1], dp[i-1][j-1]) + 1
。这里我们选择上下左右三个方向中的最小值,并加一,因为有一个步骤操作。
初始条件:
dp[0][j] = j
,因为插入j
个字符可以将空字符串转换为目标字符串。dp[i][0] = i
,因为删除i
个字符可以将空字符串转换为目标字符串。
代码实现
public class EditDistance { public int minimumDistance(String word1, String word2) { if (word1.length() == 0) { return word2.length(); } if (word2.length() == 0) { return word1.length(); } int[][] dp = new int[word1.length() + 1][word2.length() + 1]; for (int i = 0; i <= word1.length(); i++) { dp[i][0] = i; } for (int i = 0; i <= word2.length(); i++) { dp[0][i] = i; } for (int i = 1; i <= word1.length(); i++) { for (int j = 1; j <= word2.length(); j++) { if (word1.charAt(i-1) == word2.charAt(j-1)) { dp[i][j] = dp[i-1][j-1]; } else { dp[i][j] = Math.min(Math.min(dp[i-1][j], dp[i][j-1]), dp[i-1][j-1]) + 1; } } } return dp[word1.length()][word2.length()]; } public static void main(String[] args) { EditDistance editDistance = new EditDistance(); // 测试用例 System.out.println(editDistance.minimumDistance("", "abc")); // 输出: 3 System.out.println(editDistance.minimumDistance("b", "abc")); // 输出: 2 System.out.println(editDistance.minimumDistance("bb", "abc")); // 输出: 3 System.out.println(editDistance.minimumDistance("bbc", "abc")); // 输出: 3 System.out.println(editDistance.minimumDistance("bbcd", "abc")); // 输出: 4 }}
具体步骤
初始化dp
数组:首先,我们将dp
数组的所有单 元初始化,即填充第一行和第一列。
填充dp
数组:然后,我们逐个位置地填充dp
数组,比较每个字符的位置,如果字符相同,则从左上角取值,否则取最小的相邻值加一。
输出结果:最后,返回dp
数组的最后一个元素,即将两个字符串完全转换所需的最小步骤数。
这种方法通过利用动态规划,避免了重复计算,每个位置只需要考虑有限的可能操作,从而有效地解决了问题。
发表评论
最新留言
初次前来,多多关照!
[***.217.46.12]2025年05月08日 15时01分44秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
EnvironmentNotWritableError: The current user does not have write permissions to the target environm
2023-01-23
kali安装docker(亲测有效)
2023-01-23
PHP系列:PHP 基础编程 2(时间函数、数组---实现登录&注册&修改)
2023-01-23
PHP系列:使用PHP实现登录注册功能的完整指南
2023-01-23
04-docker-commit构建自定义镜像
2023-01-23
05-docker系列-使用dockerfile构建镜像
2023-01-23
09-docker系列-docker网络你了解多少(下)
2023-01-23
#C8# UVM中的factory机制 #S8.2.3# 重载sequence哪些情形
2023-01-24
cytoscape安装java_Cytoscape史上最全攻略
2023-01-24
c语言编写单片机中断,C语言AVR单片机中断程序写法
2023-01-24
java教学团队管理系统(ssm)
2023-01-24
java教师管理系统(ssm)
2023-01-24
java教师课堂助手app(ssm)
2023-01-24
java教育辅导班信息网(ssm)
2023-01-24
DDNS动态域名无固定IPSEC配置实战
2023-01-24
DELL笔记本UEFI+GPT安装window10与Ubuntu双系统
2023-01-24
EasyUi的使用与代码编写(一)
2023-01-24
Ehcache Java开源缓存框架
2023-01-24
el-select下拉框修改背景色
2023-01-24
ElasticSearch - 基于 JavaRestClient 操作索引库和文档
2023-01-24