Описание задачи
Самая сложная версия. Из шаблона keyTpl можно удалять любые зубчики и
менять местами оставшиеся. Ключ — любая перестановка любого подмножества букв.
Правило генерации
- Выбираем подмножество букв из keyTpl
- Генерируем все уникальные перестановки подмножества
- keyTpl может быть длиннее замков
Правило совпадения с замком
Если ключ короче замка, он всё равно может подойти, если "хвост" замка состоит только из -.
Lock: "A-C--"
Key: "AC"
Сравнение:
Key[0]='A' vs Lock[0]='A' ✓
Key[1]='C' vs Lock[1]='-' ✓
Lock[2]='C' — ключ короче, проверяем хвост
Lock[3]='-', Lock[4]='-' — всё OK ✓
Результат: ключ "AC" открывает замок "A-C--"
Lock: "A-C-X"
Key: "AC"
Хвост: "-X" содержит не только '-' → не открывает
Пример
Условие
keyTpl: "ACCX"
locks: ["AC--", "X---", "A-C-"]
minLocks: 2
Возможные ключи
Подмножества и их перестановки: "" (пустой), "A", "C", "X", "AC", "CA", "AX", "XA", "CX", "XC", "CC", "ACC", "CAC", "CCA", "ACX", "AXC", "CAX", "CXA", "XAC", "XCA", "CCX", "CXC", "XCC", "ACCX", ...
Результат (примерный)
countKeys → N
findKeys → [ключи, открывающие ≥2 замков]
Ключевые моменты
- Двухуровневый перебор: подмножества × перестановки
- Учитывать дубликаты букв
- Специальная логика сравнения для коротких ключей