Я работаю над проблемой Free Code Camp - http://www.freecodecamp.com/challenges/bonfire-no-repeats-please
Описание проблемы выглядит следующим образом:
Возвращает количество полных перестановок предоставленной строки, которая не имеют повторяющихся последовательных букв. Например, "aab" должен return 2, потому что он имеет 6 полных перестановок, но только 2 из них не имеют ту же букву (в этом случае "а" ), повторяющуюся.
Я знаю, что могу решить это, написав программу, которая создает каждую перестановку, а затем отфильтровывает те, у которых есть повторяющиеся символы.
Но у меня есть это гложящее чувство, что я могу решить это математически.
Первый вопрос - могу ли я?
Второй вопрос - Если да, какую формулу я мог бы использовать?
Дальнейшее уточнение -
Приведенный в задаче пример представляет собой "aab", который, по словам сайта, имеет шесть возможных перестановок, причем только два соответствуют критериям повторного символа:
aab aba baa aab aba baa
Проблема рассматривает каждый символ как уникальный, поэтому, возможно, "aab" лучше назвать "a1a2b"
Тесты для этой задачи заключаются в следующем (возврат числа перестановок, соответствующих критериям) -
"aab" should return 2
"aaa" should return 0
"abcdefa" should return 3600
"abfdefa" should return 2640
"zzzzzzzz" should return 0
Я прочитал много сообщений о Combinatorics и Permutations и просто, кажется, копаю более глубокую дыру для себя. Но я действительно хочу попытаться решить эту проблему эффективно, а не грубую силу через массив всех возможных перестановок.
Я разместил этот вопрос на math.stackexchange - https://math.stackexchange.com/q/1410184/264492
Математика для разрешения случая, когда повторяется только один символ, довольно тривиальна - факториал общего количества символов минус количество доступных пробелов, умноженное на повторяющиеся символы.
- "aab" = 3! - 2! * 2!= 2
- "abcdefa" = 7! - 6! * 2!= 3600
Но попытка выяснить формулу для случаев, когда повторяется более одного символа, ускользнула от меня. например "Abfdefa"