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
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']