
leetcode题解72-编辑距离
插入:将 word1 的末尾插入与 word2[j-1] 相同的字符,操作数为 dp[i][j-1] + 1。 删除:删除 word1 的末尾字符,操作数为 dp[i-1][j] + 1。 替换:将 word1 的末尾字符替换为 word2[j-1],操作数为 dp[i-1][j-1] + 1。
发布日期:2025-04-05 06:19:24
浏览次数:8
分类:精选文章
本文共 1353 字,大约阅读时间需要 4 分钟。
编辑距离是计算两个字符串变换所需的最小操作步骤的问题,包括插入、删除和替换操作。我们可以使用动态规划来解决这个问题,通过定义一个二维数组来记录状态。
定义状态:
dp[i][j] 表示将 word1 的前 i 个字符转换为 word2 的前 j 个字符所需的最少操作数。初始化:
- 如果 word1为空,只需要删除 j 个字符,dp[0][j] = j。
- 如果 word2为空,只需要删除 i 个字符,dp[i][0] = i。
状态转移:
假设当前字符 word1[i-1] 和 word2[j-1] 相同,那么 dp[i][j] = dp[i-1][j-1]。如果字符不同,则需要考虑三种操作:取这三种情况的最小值作为 dp[i][j]。
通过对两个字符串进行全局遍历,逐个比较字符,最终得到 dp[m][n],即将 word1 转换为 word2 所需的最少操作数。
具体实现如下:
public int minDistance(String word1, String word2) { int m = word1.length(); int 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] + 1, // 删除 dp[i][j - 1] + 1, // 插入 dp[i - 1][j - 1] + 1 // 替换 ); } } } return dp[m][n];}
注意事项:
- 解决这个问题可以使用空间优化,将二维数组转换为一维数组,只记录当前行和上一行,节省内存。
- 字符比较时,可以直接字符匹配,确保兼容大小写。
发表评论
最新留言
网站不错 人气很旺了 加油
[***.192.178.218]2025年04月26日 17时04分26秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
element 如何使用自定义icon图标
2025-03-29
element-ui:el-input输入数字-整数和小数
2025-03-29
ElementUI-el-progress改变进度条颜色跟文字样式
2025-03-29
elTable火狐浏览器换行
2025-03-29
15个Python数据处理技巧(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
0基础成功转行网络安全工程师,年薪30W+,经验总结都在这(建议收藏)
2025-03-29
10个程序员可以接私活的平台
2025-03-29
10款最佳免费WiFi黑客工具(附传送门)零基础入门到精通,收藏这一篇就够了
2025-03-29
15个备受欢迎的嵌入式GUI库,从零基础到精通,收藏这篇就够了!
2025-03-29
15个程序员常逛的宝藏网站!!从零基础到精通,收藏这篇就够了!
2025-03-29
2024 年需要了解的顶级大数据工具(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
2024大模型行业应用十大典范案例集(非常详细)零基础入门到精通,收藏这一篇就够了
2025-03-29
2024年全球顶尖杀毒软件,从零基础到精通,收藏这篇就够了!
2025-03-29