Find all list permutations of splitting a string in Python

后端 未结 6 2302
迷失自我
迷失自我 2020-12-30 06:42

I have a string of letters that I\'d like to split into all possible combinations (the order of letters must be remain fixed), so that:

s = \'monkey\'
         


        
6条回答
  •  悲&欢浪女
    2020-12-30 06:47

    The idea is to realize that the permutation of a string s is equal to a set containing s itself, and a set union of each substring X of s with the permutation of s\X. For example, permute('key'):

    1. {'key'} # 'key' itself
    2. {'k', 'ey'} # substring 'k' union 1st permutation of 'ey' = {'e, 'y'}
    3. {'k', 'e', 'y'} # substring 'k' union 2nd permutation of 'ey' = {'ey'}
    4. {'ke', 'y'} # substring 'ke' union 1st and only permutation of 'y' = {'y'}
    5. Union of 1, 2, 3, and 4, yield all permutations of the string key.

    With this in mind, a simple algorithm can be implemented:

    >>> def permute(s):
        result = [[s]]
        for i in range(1, len(s)):
            first = [s[:i]]
            rest = s[i:]
            for p in permute(rest):
                result.append(first + p)
        return result
    
    >>> for p in permute('monkey'):
            print(p)    
    
    ['monkey']
    ['m', 'onkey']
    ['m', 'o', 'nkey']
    ['m', 'o', 'n', 'key']
    ['m', 'o', 'n', 'k', 'ey']
    ['m', 'o', 'n', 'k', 'e', 'y']
    ['m', 'o', 'n', 'ke', 'y']
    ['m', 'o', 'nk', 'ey']
    ['m', 'o', 'nk', 'e', 'y']
    ['m', 'o', 'nke', 'y']
    ['m', 'on', 'key']
    ['m', 'on', 'k', 'ey']
    ['m', 'on', 'k', 'e', 'y']
    ['m', 'on', 'ke', 'y']
    ['m', 'onk', 'ey']
    ['m', 'onk', 'e', 'y']
    ['m', 'onke', 'y']
    ['mo', 'nkey']
    ['mo', 'n', 'key']
    ['mo', 'n', 'k', 'ey']
    ['mo', 'n', 'k', 'e', 'y']
    ['mo', 'n', 'ke', 'y']
    ['mo', 'nk', 'ey']
    ['mo', 'nk', 'e', 'y']
    ['mo', 'nke', 'y']
    ['mon', 'key']
    ['mon', 'k', 'ey']
    ['mon', 'k', 'e', 'y']
    ['mon', 'ke', 'y']
    ['monk', 'ey']
    ['monk', 'e', 'y']
    ['monke', 'y']
    

提交回复
热议问题