跳转到主内容
趣航编程网 - 趣学编程,启航技术之路!

如何在 Java 中利用数组实现简单的最短编辑距离(Levenshtein Distance)矩阵计算

最短编辑距离用二维DP数组dpi实现,表示word1前i字符转word2前j字符的最少操作数;初始化dp0=j、dpi=i;递推时字符相等则dpi=dpi-1,否则取删、插、替三者最小值加1。 在 java 中用数组实现最短编辑距离(levenshtein distance),核心是构建一个二维 dp 数组
dp[i][j]
,表示将
word1
的前
i
个字符转换为
word2
的前
j
个字符所需的最少操作数(插入、删除、替换)。空间和逻辑都可控,适合理解算法本质。 初始化二维 DP 数组 设
word1
长度为
m
word2
长度为
n
,申请
int[m+1][n+1]
数组:
dp[0][j] = j
:空字符串变
word2
j
字符,只能靠
j
次插入
dp[i][0] = i
word1
i
字符变为空字符串,只能靠
i
次删除 填表逻辑:逐行逐列递推 对每个
i ∈ [1, m]
j ∈ [1, n]
: 若
word1.charAt(i-1) == word2.charAt(j-1)
,则
dp[i][j] = dp[i-1][j-1]
(无需操作) 否则取三种操作的最小值加 1:
dp[i-1][j] + 1
(删
word1[i-1]
dp[i][j-1] + 1
(在
word1
末尾插
word2[j-1]
dp[i-1][j-1] + 1
(将
word1[i-1]
替换为
word2[j-1]
) 完整可运行示例代码 // 注意:索引从 0 开始,字符串下标需 -1
public static int levenshteinDistance(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;

// 填充 DP 表
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(
                Math.min(dp[i - 1][j] + 1,     // 删除
                         dp[i][j - 1] + 1),    // 插入
                dp[i - 1][j - 1] + 1          // 替换
            );
        }
    }
}
return dp[m][n];
} Eclipse导入Android或其他的JAVA项目的正确方法 WORD版 本文档主要讲述的是Eclipse导入Android或其他的JAVA项目的正确方法;希望本文档会给有需要的朋友带来帮助;感兴趣的朋友可以过来看看 下载 立即学习 “ Java免费学习笔记(深入) ”; 小技巧:空间优化到一维数组(可选) 因每行只依赖上一行,可用两个一维数组(
prev
curr
)或仅用一个数组滚动更新: 维护
int[] dp = new int[n + 1]
每次迭代前保存
dp[j-1]
(即左上角值),用临时变量记录上一轮的
dp[j]
适合内存敏感场景,但初学建议先掌握二维写法

相关文章