Ctrl K

Семейства слов на один обмен

Сложная
Назовём два слова **похожими**, если они совпадают или одно получается из другого обменом двух букв, стоящих на разных позициях. Дан список words, в котором все слова одной длины и составлены из одного и того же набора букв (каждое — перестановка любого другого). Слова разбиваются на **семейства**: два слова попадают в одно семейство, если от одного к другому можно перейти цепочкой слов из списка, где каждые два соседних похожи. Например, «abcd» и «badc» не похожи, но окажутся в одном семействе, если в списке есть «bacd». Верните количество семейств.
Пример 1
words=['stone', 'tones', 'notes', 'onset', 'tonse'] → 3

«tones» похоже на «notes» (обмен t и n) и на «tonse» (обмен e и s), так что эти три слова — одно семейство. «stone» и «onset» не похожи ни на одно слово списка, это ещё два семейства. Всего 3.

Пример 2
words=['abcd', 'bacd', 'badc', 'cdab'] → 2

«abcd» → «bacd» → «badc» связаны цепочкой обменов, хотя «abcd» и «badc» напрямую не похожи. «cdab» отличается от каждого из них во всех четырёх позициях. Ответ 2.

Пример 3
words=['xy', 'xy'] → 1

Одинаковые слова считаются похожими, это одно семейство.

Ограничения
  • 1 ≤ len(words) ≤ 300
  • 1 ≤ len(words[i]) ≤ 300
  • words[i] состоит из строчных латинских букв
  • Все слова одной длины и являются перестановками друг друга
Встречал эту задачу на настоящем собесе?
Решили0
Пробовали0
Отправок0
Принято—
Темы
Похожие задачиСклеить карточки контактов СредняяЦепочки синонимов СредняяПерестановки по связям СредняяКого вылечить первым СложнаяКого отключить от сети Сложная
загружаем Python…
Вход
words=['stone', 'tones', 'notes', 'onset', 'tonse']
Ожидается
3

«Запустить» — первые 3 теста у тебя в браузере, «Отправить» — все 30 тестов на сервере, включая скрытые.