Edit Distance Problem in Java

2025年5月2日 | 阅读3分钟

编辑距离问题是算法和数据结构领域另一个经典的问。它也被称为 Levenshtein 距离问题。它确定了将一个字符串转换为另一个字符串所需的最少操作次数。在拼写检查器、DNA 序列分析和自然语言处理等情况下,此问题表明了应用动态规划方法来解决挑战性问题的必要性。

问题陈述

在考虑两个字符串;设它们为 str1 和 str2,编辑距离问题代表了对字符串 str1 所需的最小操作,以便 str1 变成 str2。允许的操作是

插入:它涉及向字符串追加一个字符。

删除:删除字符串中的一个字符。

替换:替换,其中一个或多个字符被更改。

所有这些操作的成本都是 1 美元,因此,目标是确定可能的最小结果。

方法:动态规划解决方案

另一种选择是考虑所有潜在的操作顺序来进行计算,这在字符串较长时是不可行的,因为时间复杂度等于指数级。然而,存在一种 DP 解决方案,可以找到最优解,如下所示,我们将问题分解为重叠的子问题。

关键概念

递推关系基本思想是计算两个字符串前缀之间的编辑距离。现在设 m 为第一个字符串 str1 的长度,n 为第二个字符串 str2 的长度。我们将为 dp[i][j] 制定递归定义,作为 str1 的前 i 个字符和 str2 的前 j 个字符之间的最小编辑距离。

递推关系是

基本上,如果 str1 和 str2 中的字符相同,则不需要进行任何操作,因此关系为 dp[i][j] = dp[i-1][j-1]。

如果 str1[i-1] != str2[j-1],我们考虑三种操作

插入: dp[i][j] = dp[i][j-1] + 1

删除: dp[i][j] = dp[i-1][j] + 1

替换: dp[i][j] = dp[i-1][j-1] + 1

然后我们只取这三个值中的最小值。

基本情况

  • dp[0][j] = j:我们问了两个问题:如果 str1 为空,那么需要多少次插入才能使其等于 str2,以及 j 的值是多少?
  • dp[i][0] = i:如果第二个字符串为空,那么为了使第一个字符串为空,我们需要进行 'i' 次删除。
  • 最终输出:完成 dp 表后,dp[m][n] 的值表示字符串 str1 和 str2 的最小编辑距离。

文件名:EditDistance.java

输出

 
The Edit Distance between sunday and saturday is: 3   

结论

编辑距离问题是动态规划问题之一,用于解决现实生活中的问题。通过口头迭代它们之间的关系,并使用矩阵来保存半结果,可以在最小操作需求下转换这两个字符串。

此 Java 实现展示了动态规划如何在解决本可以需要指数级递归调用的问题时发挥作用。编辑距离算法仍然被认为是基础算法之一,许多当代开发人员在自然语言处理、计算生物学以及最近的AI 文本纠正应用等领域工作。