Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.
Реализуйте функцию, которая принимает строку и возвращает массив всех перестановок её символов.
Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.
В примере символ — Unicode code point, а одинаковые итоговые строки не дублируются:
function permutations(text) {
const chars = Array.from(text);
const counts = new Map();
for (const ch of chars) counts.set(ch, (counts.get(ch) ?? 0) + 1);
const result = [], path = [];
function visit() {
if (path.length === chars.length) { result.push(path.join('')); return; }
for (const [ch, count] of counts) {
if (!count) continue;
counts.set(ch, count - 1);
path.push(ch);
visit();
path.pop();
counts.set(ch, count);
}
}
visit();
return result;
}
Для пустой строки результат ['']. При различных символах размер ответа n!, время и память результата порядка O(n·n!), поэтому функция годится только для небольших строк.