Занимательные программистские задачки

You are given a dictionary of all valid words. You have the following 3 operations permitted on a word: delete a character, insert a character, replace a character. Now given two words — word1 and word2 — find the minimum number of steps required to convert word1 to word2. (one operation counts as 1 step.)

У кого нибудь есть идеи элегантного решения?

Підписуйтеся на Telegram-канал «DOU #tech», щоб не пропустити нові технічні статті

👍ПодобаєтьсяСподобалось0
До обраногоВ обраному0
LinkedIn
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Дозволені теги: blockquote, a, pre, code, ul, ol, li, b, i, del.
Ctrl + Enter
Ок, подытоживая тему.
Действительно условие задачи не совсем понятно и фактически у нас есть две задачи: — когда каждая мутация исходного слова должна быть частью заданого словаря — нужно найти наикратчайший путь преобразования абстрагируясь от словаря.
В первом случае мне тоже пришел в голову алгоритм с графом, и я пока что лучше не вижу.

Касательно второго интересную статью привел Віктор Гайдін, но решения целевой задачи из нее к сожалению не следует...

По-моєму це Levenshtein distance. Правда я не зрозумів, до чого переше речення завдання...

Решается методом поиска минимального маршрута в ненагруженном графе. Вершины графа — слова словаря, рёбра соединяют те слова, одно из которых может быть получено из второго при помощи одной операции.

Не знаю насколько это элегантное решение. На php строк 100.

елементів з його ’r< =2’-кола, і т. д. Поки на ’r< =n’-колі не наткнемося на word2 або програма не буде зупинена.

P.S. 2Модератор: Якщо можливо, видаліть, будь ласка мій 1-ий (порожній) пост у цій темі, і об’єднайте останні в один. Писав з мобільного, тут дуже маленька кількість символів вміщається в поле для вводу...: -)

тоді проходимось по всіх словах вже побудованого псевдословника, і для тих його елементів, які мають > = 2 предків у словнику, перевіряємо, чи якісь із них можуть бути утворені одне з одного шляхом заміни 1 букви; якщо так, збільшуємо ’r=1’-кола обох на 1 входження. Звільняємо пам’ять від псевдословника.

У кінці для word1 будуємо ’r< =2’-коло як об’єднання ’r=1’-кіл елементів, які належать до його ’r=1’-кола, тоді ’r< =3’-коло як об’єднання ’r=1’-кіл

викидання із нього якої-небудь букви належить словнику; якщо так, додаємо більше слово ’r=1’-кола меншого, а менше — до ’r=1’-кола більшого. І таке в циклі по всіх словах словника. На другому кроці будуємо допоміжний псевдословник, який складатиметься із всеможливих результатів викидання із слів словника 1 букви; при цьому кожен елемент псевдословника повинен містити посилання на слова, від яких він утворений (останніх може бути декілька);

Алгоритмів можна придумати багато, але розмірковувати про ефективність можна тільки після хоч якоїсь конкретизації вхідних параметрів: чи пошук відстані між словами буде не одноразовий, розмір словника, розмір алфавіту,...

Приклад одного з алгоритмів. Спочатку із кожним словом із словника асоціюємо множину інших слів, які можна отримати із нього за одну операцію. Для цього на першому кроці беремо слово із словника і перевіряємо, чи результат

класика динамічного програмування, наприклад: algolist.manual.ru/search/lcs

Наверно, имелось в виду, что полученое в результате каждой операции слово должно принадлежать словарю.

Поудалять все несовпадающие символы, а потом доставить недостающие?:)

Підписатись на коментарі