leetcode — edit-distance
发布日期:2025-04-05 01:56:40 浏览次数:9 分类:精选文章

本文共 2133 字,大约阅读时间需要 7 分钟。

如何计算字符串的最短编辑距离?

当我们面对将一个字符串转换为另一个字符串的任务时,很可能会需要插入、删除或替换字符。为了找到最有效率的转换方法,我们可以使用动态规划来解决这个问题。

动态规划方法的工作原理

  • 问题分析:我们需要将两个字符串转换为什么样可以用最少的步骤。每一步操作可以是插入、删除或替换,这一步的影响取决于两个字符串的当前字符是否匹配。

  • 状态定义:定义 dp[i][j] 表示将前 i 个字符变为前 j 个字符所需的最小步骤数。当 ij 为 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数组的最后一个元素,即将两个字符串完全转换所需的最小步骤数。

  • 这种方法通过利用动态规划,避免了重复计算,每个位置只需要考虑有限的可能操作,从而有效地解决了问题。

    上一篇:LeetCode 中级 - 有序链表转换二叉搜索树(109)
    下一篇:LeetCode – Refresh – Valid Number

    发表评论

    最新留言

    初次前来,多多关照!
    [***.217.46.12]2025年05月08日 15时01分44秒