Получаване на всяка стъпка от разстоянието на Левенщайн

Имам програма на Java, която изчислява разстоянието на Левенщайн между два низа. Използвам този метод, за да го направя:

    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);
}

Както подсказва заглавието, трябва да получа всяка стъпка в тази процедура. Наистина не ме интересува как се връща (може да бъде разделен с нов ред, в списък с масиви и т.н.) или в какъв ред е, само че един знак се променя на всяка стъпка.

Примери:

distance("saturday", "sauterdai"); -> "saturday", "sauterday", "sauterdai"
distance("algorithm", "algurthm") -> "algorithm", "algorthm", "algurithm"
distance("stackoverflow", "mathoverflow") -> "stackoverflow", "tackoverflow", "tckoverflow", "tkoverflow", "toverflow", "mtoverflow", "matoverflow", "mathoverflow"

person Loovjo    schedule 30.05.2015    source източник
comment
Заявката за Java, а не за псевдокод, съчетана с липсата на Java код във въпроса, прави това по-скоро заявка за услуга за писане на код, отколкото въпрос.   -  person Patricia Shanahan    schedule 30.05.2015
comment
Моля, предоставете своя код на Java, а не на pseudo-code   -  person CKing    schedule 30.05.2015
comment
@PatriciaShanahan Добре, псевдокодът е разрешен.   -  person Loovjo    schedule 30.05.2015
comment
Все още се нуждаете от код във въпроса си, а не само връзка. Връзките могат да изчезнат и много хора не следват връзки на общи принципи.   -  person Patricia Shanahan    schedule 30.05.2015
comment
Не го правете рекурсивно, използвайте динамично програмиране. От таблицата, която създавате с dp, можете да се върнете назад и да намерите всяка извършена стъпка.   -  person vandale    schedule 30.05.2015
comment
Динамичното програмиране определено би било по-добро за това, защото подпроблемите ще се появят отново по време на търсенето. С DP резултатите от подпроблема могат да бъдат извлечени без повторно изчисление.   -  person Patricia Shanahan    schedule 30.05.2015


Отговори (1)


Не можете да сте сигурни, че дадена промяна ще бъде в действителния път, докато рекурсията не завърши. Ето една стратегия за справяне с това:

Дефинирайте структура от данни, която улавя List<String> заедно с целите разходи за използване на този списък като верига от промени. Накарайте levDistance да върне препратка към екземпляр на тази структура от данни.

В основния случай списъкът съдържа само оригиналните два низа. За неосновния случай разпределете изчислението на минимума и попълнете новия междинен низ за избрания случай.

person Patricia Shanahan    schedule 30.05.2015