объяснение
Расстояние редактирования между двумя строками является функцией минимально возможного количества вставок, удалений или замен для преобразования одного слова в другое.
Вставки и удаления стоят 1, а замены стоят 2.
Например, расстояние между AB
и A
равно 1, потому что удаление стоит 1, и единственное необходимое редактирование - это удаление B
символа.
Расстояние между CAR
и FAR
равно 2, потому что замены стоят 2. Еще один способ взглянуть на это - одно удаление и одна вставка.
правила
Учитывая две входные строки (предоставленные, однако, удобно на вашем языке), ваша программа должна найти минимальное расстояние редактирования между двумя строками.
Вы можете предположить, что строки содержат только символы A-Z
и содержат менее 100 символов и более 0 символов.
Это код гольф , поэтому выигрывает самое короткое решение.
Примеры тестовых случаев
ISLANDER, SLANDER
> 1
MART, KARMA
> 5
KITTEN, SITTING
> 5
INTENTION, EXECUTION
> 8
levenshtein
функция обрабатывает замены как одно редактирование (замена), а не два (удаление + вставка).Ответы:
бред, 2680
Использование динамического программирования, конечно.
Входные строки должны быть разделены пробелом, за которым следует новая строка. Например:
источник
Python, 138
148152персонажаХорошо, я знал принцип, но никогда раньше не реализовывал расстояние редактирования, так что здесь:
источник
PHP, 40
Следует установленным правилам, но не соответствует духу правил:
Принимает в качестве аргументов два параметра. Пример вызова:
php edit_dist.php word1 word2
.Обычно
levenshtein()
подстановка рассматривается как одна операция, но она имеет перегруженную форму, в которой могут быть указаны веса вставки / суб / удаления. В этом случае его 1/2/1.источник
APL (90 символов)
Я использую Dyalog APL в качестве моего интерпретатора,
⎕IO
установив в 1 и⎕ML
установив в 0. Прямая функция ({ ... }
) вычисляет, учитывая строку в качестве входных данных, следующую строку в матрице расстояний. (Он начинается с начальной строки:.0,⍳x
) Оператор power (⍣
) используется для вложения функции один раз для каждого символа во второй строке (⊃⍴b
). После всего этого, последняя строка переворачивается (⌽
), и ее первый элемент берется (⊃
).Пример:
источник
R 51
Это читает в две строки от пользователя (которые являются входными данными), а затем просто использует
adist
функцию для расчета расстояния. Поскольку подстановки стоят 2 для этой проблемы, нам нужно добавить именованный вектор для параметра cost для adist. Так как для adist также есть параметр count, мы можем только сократить расходы, потому что у нас все еще есть уникальное соответствие для имен параметров.Пример использования
источник
Руби 1.9, 124
Golfed версии медленного, рекурсивного метода рубинового здесь , модифицировано , чтобы удвоить вес для замены. Тот факт, что для удаления первого символа строки требуется 7 символов, действительно вреден, и было бы здорово заменить
(a[0]==b[0]?-1:1)
что-то вроде этого,-1**a[0]<=>b[0]
но порядок операций - не мой друг.источник
Smalltalk (Smalltalk / X), 34
Мне повезло - стандартный класс "String" уже содержит левенштейны:
введите a, b:
(дополнительные параметры учитывают различные веса при замене, удалении и т. д.)
Тестовый забег:
->
источник