Реализуйте функцию, которая принимает строку и возвращает массив всех перестановок её символов.

Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.

Короткий ответ

Что ответить на собеседовании

Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.

Подробный разбор

Ответ с пояснениями

Перебирайте символы рекурсивно, уменьшая их доступные количества; это позволяет получить каждую уникальную перестановку один раз.

В примере символ — 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!), поэтому функция годится только для небольших строк.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее