How can I interleave or create unique permutations of two strings (without recursion)

后端 未结 4 1143
难免孤独
难免孤独 2020-11-30 08:27

The question is to print all possible interleavings of two given strings. So I wrote a working code in Python which runs like this:

def inter(arr1,arr2,p1,p2         


        
4条回答
  •  半阙折子戏
    2020-11-30 08:55

    okay, after some work, and usign advice from other answers. mainly lazyr. (and have now converted it into a class) the __all_perms is from: https://stackoverflow.com/a/104436/1561176

    class Interleave():
    
        def __init__(self, A, B):
            self.A = A
            self.B = B
            self.results = list(self.__interleave())
    
        # from https://stackoverflow.com/a/104436/1561176
        def __all_perms(self, elements):
            if len(elements) <=1:
                yield elements
            else:
                for perm in self.__all_perms(elements[1:]):
                    for i in range(len(elements)):
                        #nb elements[0:1] works in both string and list contexts
                        yield perm[:i] + elements[0:1] + perm[i:]
    
        def __sequences(self):
            return list( sorted( set(
                ["".join(x) for x in self.__all_perms(['a'] * len(self.A) + ['b'] * len(self.B))] ) ) )
    
        def __interleave(self):
            for sequence in self.__sequences():
                result = ""
                a = 0
                b = 0
                for item in sequence:
                    if item == 'a':
                        result+=self.A[a]
                        a+=1
                    else:
                        result+=self.B[b]
                        b+=1
                yield result
    
        def __str__(self):
            return str(self.results)
    
        def __repr__(self):
            return repr(self.results)
    

    and here is the usage:

    >>> A = ['a', 'b', 'c']
    >>> B = ['d', 'e', 'f']
    >>> Interleave(A, B)
    ['abcdef', 'abdcef', 'abdecf', 'abdefc', 'adbcef', 'adbecf', 'adbefc', 'adebcf', 'adebfc', 'adefbc', 'dabcef', 'dabecf', 'dabefc', 'daebcf', 'daebfc', 'daefbc', 'deabcf', 'deabfc', 'deafbc', 'defabc']
    

    also, you can access the Class members like:

    >>> inter = Interleave(A, B)
    >>> inter.results
    ['abcdef', 'abdcef', 'abdecf', 'abdefc', 'adbcef', 'adbecf', 'adbefc', 'adebcf', 'adebfc', 'adefbc', 'dabcef', 'dabecf', 'dabefc', 'daebcf', 'daebfc', 'daefbc', 'deabcf', 'deabfc', 'deafbc', 'defabc']
    >>> inter.A
    ['a', 'b', 'c']
    >>> inter.B
    ['d', 'e', 'f']
    

提交回复
热议问题