我有一个Java程序来计算两个字符串之间的Levenshtein距离。我用这种方法来做到这一点:
public static int levDistance(String s, int len_s, String t, int len_t) {
if (len_s == 0)
return len_t;
if (len_t == 0)
return len_s;
int cost = 0;
if (s.charAt(len_s - 1) == t.charAt(len_t - 1))
cost = 0;
else
cost = 1;
return Math.min(Math.min(
levDistance(s, len_s - 1, t, len_t) + 1,
levDistance(s, len_s, t, len_t - 1) + 1),
levDistance(s, len_s - 1, t, len_t - 1) + cost);
}
正如标题所示,我需要完成此程序的每一步。我并不十分关心它是如何返回的(可以是新行分隔的,在一个arraylist中等),或者它的顺序是什么,只是每一步都改变了一个字符。
示例:
distance("saturday", "sauterdai"); -> "saturday", "sauterday", "sauterdai"
distance("algorithm", "algurthm") -> "algorithm", "algorthm", "algurithm"
distance("stackoverflow", "mathoverflow") -> "stackoverflow", "tackoverflow", "tckoverflow", "tkoverflow", "toverflow", "mtoverflow", "matoverflow", "mathoverflow"
答案 0 :(得分:1)
在递归完成之前,您无法确定给定的更改是否在实际路径中。以下是处理该问题的一种策略:
定义一个捕获List<String>
的数据结构以及将该列表用作更改链的整数成本。使levDistance
返回对该数据结构实例的引用。
在基本情况下,列表仅包含原始的两个字符串。对于非基本情况,展开最小值的计算,并为所选案例填写新的中间字符串。