Java实现Levenshtein Distance输出结果异常问题求助
解决Levenshtein距离结果比实际值少1的问题
嘿,我刚看到你在Java课程作业里实现Levenshtein距离时遇到的麻烦——比如比较"cat"和"hat",正确距离应该是1,但你的输出却是0。我之前帮不少同学排查过这类问题,大概率是边界条件或者初始化逻辑出了疏漏,咱们一步步拆解可能的原因:
常见问题点及修复方案
1. DP表初始化的大小或边界填充错误
Levenshtein距离的核心是构建一个(n+1)×(m+1)的DP表(n和m分别是两个字符串的长度),用来存储子问题的结果。如果你的代码犯了以下任意一个错误,都会导致结果少1:
- 只创建了
n×m大小的数组,没给边界留位置 - 填充第一行/第一列时,没有从0递增到字符串长度(比如只填充到
n-1或m-1)
举个错误的初始化例子:
// 错误:数组大小没+1,边界无法完整填充 int[][] dp = new int[s1.length()][s2.length()];
正确的初始化应该是:
int[][] dp = new int[s1.length() + 1][s2.length() + 1]; // 填充第一列:空字符串转成s1前i个字符的距离是i for (int i = 0; i <= s1.length(); i++) { dp[i][0] = i; } // 填充第一行:空字符串转成s2前j个字符的距离是j for (int j = 0; j <= s2.length(); j++) { dp[0][j] = j; }
2. 最终结果取错了索引
就算DP表初始化正确,如果你最后返回的是dp[s1.length()-1][s2.length()-1]而不是dp[s1.length()][s2.length()],也会得到少1的结果。因为DP表的dp[n][m]才是两个完整字符串比较后的最终距离,而dp[n-1][m-1]只是最后一个字符比较后的子问题结果。
3. 字符相等时的赋值逻辑错误
当两个字符相等时,正确的逻辑是直接继承左上角的子问题结果:dp[i][j] = dp[i-1][j-1]。如果你的代码错误地写成了dp[i][j] = dp[i-1][j-1] - 1,也会导致整体结果被多减了1。
快速排查步骤
针对你遇到的"cat"和"hat"的例子,你可以:
- 打印出DP表的所有值,看看第一行是不是
[0,1,2,3],第一列是不是[0,1,2,3] - 确认
dp[3][3]的值是不是1,而你返回的是不是这个位置的值
按照这几个方向排查,应该很快就能找到问题所在啦!
内容的提问来源于stack exchange,提问作者Will Edwards
相关产品推荐
相关产品推荐

