Permutations excluding repeated characters

前端 未结 5 1129
無奈伤痛
無奈伤痛 2021-02-06 01:43

I\'m working on a Free Code Camp problem - http://www.freecodecamp.com/challenges/bonfire-no-repeats-please

The problem description is as follows -

<
5条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-06 02:23

    Here's one way to think about it, which still seems a bit complicated to me: subtract the count of possibilities with disallowed neighbors.

    For example abfdefa:

    There are 6 ways to place "aa" or "ff" between the 5! ways to arrange the other five 
    letters, so altogether 5! * 6 * 2, multiplied by their number of permutations (2).
    
    Based on the inclusion-exclusion principle, we subtract those possibilities that include
    both "aa" and "ff" from the count above: 3! * (2 + 4 - 1) choose 2 ways to place both
    "aa" and "ff" around the other three letters, and we must multiply by the permutation
    counts within (2 * 2) and between (2).
    
    So altogether,
    
    7! - (5! * 6 * 2 * 2 - 3! * (2 + 4 - 1) choose 2 * 2 * 2 * 2) = 2640
    

    I used the formula for multiset combinations for the count of ways to place the letter pairs between the rest.

    A generalizable way that might achieve some improvement over the brute force solution is to enumerate the ways to interleave the letters with repeats and then multiply by the ways to partition the rest around them, taking into account the spaces that must be filled. The example, abfdefa, might look something like this:

    afaf / fafa  =>  (5 + 3 - 1) choose 3  // all ways to partition the rest
    affa / faaf  =>  1 + 4 + (4 + 2 - 1) choose 2  // all three in the middle; two in the middle, one anywhere else; one in the middle, two anywhere else
    aaff / ffaa  =>  3 + 1 + 1  // one in each required space, the other anywhere else; two in one required space, one in the other (x2)
    

    Finally, multiply by the permutation counts, so altogether:

    2 * 2! * 2! * 3! * ((5 + 3 - 1) choose 3 + 1 + 4 + (4 + 2 - 1) choose 2 + 3 + 1 + 1) = 2640
    

提交回复
热议问题