从Levenshtein距离

时间:2015-05-30 14:30:52

标签: java string levenshtein-distance

我有一个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"

1 个答案:

答案 0 :(得分:1)

在递归完成之前,您无法确定给定的更改是否在实际路径中。以下是处理该问题的一种策略:

定义一个捕获List<String>的数据结构以及将该列表用作更改链的整数成本。使levDistance返回对该数据结构实例的引用。

在基本情况下,列表仅包含原始的两个字符串。对于非基本情况,展开最小值的计算,并为所选案例填写新的中间字符串。