Я работаю над проблемой Free Code Camp - http://www.freecodecamp.com/challenges/bonfire-no-repeats-pleaseПерестановки за исключением повторяющихся символов
Описание проблемы заключается в следующем -
Возвращает количество полных перестановок предоставленной строки, дона» t повторяются последовательные буквы. Например, «aab» должен вернуть 2, потому что он имеет 6 полных перестановок, но только 2 из них не имеют повторяющуюся букву (в данном случае «a»).
Я знаю, что могу решить это, написав программу, которая создает каждую перестановку, а затем отфильтровывает те, которые повторяются.
Но у меня есть это грызущее чувство, что я могу решить это математически.
Первый вопрос, тогда - можно?
Второй вопрос - Если да, то какую формулу я мог бы использовать?
Для дальнейшей разработки -
Примера, приведенный в задаче «ааЪ», который говорится на сайте имеется шесть возможных перестановок, только две встречи неповторных критерии характера:
ааЪ аба бея ааЪ аба бея
проблемы видит каждый символ как уникальный, так, может быть, «AAB» может лучше охарактеризовать как «a1a2b»
тестов для этой задачи заключаются в следующих (возвращая число перестановок, которые соответствуют ЧРИ Teria) -
"aab" should return 2
"aaa" should return 0
"abcdefa" should return 3600
"abfdefa" should return 2640
"zzzzzzzz" should return 0
Я прочитал много пост о комбинаторике и Перестановки и кажутся просто рыть себе яму для себя. Но я действительно хочу попытаться решить эту проблему эффективно, а не грубую силу через массив всех возможных перестановок.
Я отправил этот вопрос на math.stackexchange - https://math.stackexchange.com/q/1410184/264492
математик разрешить случай, когда только один символ повторяется довольно тривиален - Факториал от общего числа символов минус числа пробелов, доступных умноженных повторных символами.
- "aab" = 3! - 2! * 2! = 2
- "abcdefa" = 7! - 6! * 2! = 3600
Но попытка выяснить формулу для случаев, когда повторяется более одного символа, ускользнула от меня. например "abfdefa"
Это кажется лучшим ответом на вопрос, но я не мог его реализовать и закончил программирование решения с алгоритмом кучи, который создал все перестановки и затем отфильтровал повторы. –
@JJMax Да, он отвечает на математическую версию простой строки, но моя догадка - исключение включения может оказаться слишком сложным для больших строк. Я предполагаю, что сайт может искать полу-грубую силу. –
@JJMax Я добавил комбинаторный способ, основанный на перегородках, а не на включение исключения, которое, я думаю, может быть обобщаемым и предлагать улучшение над грубой силой (я понимаю, что это может быть не очень важно для вас.) –