Это вторая статья из серии о вопросах на собеседовании по программированию и о том, как их продумать и решить! Если вы хотите начать с начала, посмотрите даже вхождение!
В этой статье рассматривается очень распространенный вопрос на собеседовании, все варианты набора. ‘Реализуйте функцию, которая получает все перестановки или порядок заданной строки. Например, если вводится «abc», вывод должен быть [‘abc’, ‘acb’, ‘cab’, ‘cba’, ‘bca’, ‘bac’].
Анализ
Многие люди слышат слово перестановка и пугаются, поэтому давайте сначала разберемся, что такое перестановка на самом деле.
Перестановка относится к действию расположения всех членов множества в некую последовательность или порядок.
Легкий! Ну .. не совсем, но, по крайней мере, теперь мы знаем, что нам нужно вернуть в конце. То есть, если нам дано «abc»; результат должен быть:
[ 'abc', 'acb', 'bac', 'bca', 'cab', 'cba']
Давайте сначала посмотрим, как можно естественным образом решить эту проблему. Если бы задано «abc», я бы, естественно, отделил первую букву и нашел все перестановки следующих двух букв. Итак, для «abc» у меня было бы:
a bc a cb b ac b ca c ab c ba
В этом случае я сразу вспоминаю рекурсию, потому что мы не знаем, насколько большой будет строка в наших тестовых примерах. Итак, для всех букв в строке мы можем взять одну букву строки и добавить ее ко всем ее перестановкам без буквы в ней. В рекурсии нам нужен наш базовый случай, когда мы хотим остановить наш рекурсивный вызов. В этом случае, когда строка состоит из одного символа, мы вернем этот символ.
permutations(abc) = a + permutations(bc) + b + permutations(ac) + c + permutations(ab) permutations(ab) = a + permutations(b) + b + permutations(a) permutations(a) = a
Псевдокод
function getAllPermutations (string) define results if string is a single character add the character to results return results for each char in string define innerPermutations as a char of string set innerPermutations to getAllPermutations (without next char) foreach string in innerPermutations add defined char and innerPermutations char return results
Сложность
Сложность описанного выше алгоритма по времени и пространству должна быть такой же, как и количество произведенных элементов. Количество уникальных перестановок любого набора размера n равно n!, Поэтому временная и пространственная сложность нашего алгоритма равна O (n!).
Код
Этот пост написал один из инструкторов Banyan Codecamp, нового учебного курса по программированию, разработанного с единственной целью: превратить начинающих программистов в способных инженеров под руководством старших инженеров. Получи высшее образование, сделай шестизначное число и учись на прекрасном острове Бали. Чтобы узнать больше, посетите www.codeinbali.com.