这个问题是要输出两个给定字符串的所有可能交错排列。我在Python中编写了一个可行的代码,运行如下:
def inter(arr1,arr2,p1,p2,arr):
thisarr = copy(arr)
if p1 == len(arr1) and p2 == len(arr2):
printarr(thisarr)
elif p1 == len(arr1):
thisarr.extend(arr2[p2:])
printarr(thisarr)
elif p2 == len(arr2):
thisarr.extend(arr1[p1:])
printarr(thisarr)
else:
thisarr.append(arr1[p1])
inter(arr1,arr2,p1+1,p2,thisarr)
del thisarr[-1]
thisarr.append(arr2[p2])
inter(arr1,arr2,p1,p2+1,thisarr)
return
该代码在字符串的每个位置进行递归调用,对于一个递归调用,它将当前元素视为属于第一个数组,在下一次调用中,则视为属于另一个数组。因此,如果输入字符串是
ab
和cd
,则输出abcd
、acbd
、cdab
、cabd
等。p1
和p2
是指向数组的指针(因为Python字符串是不可变的,我使用了数组!)。有人能告诉我这段代码的复杂度吗?它是否可以改进?我编写了类似的代码来打印给定数组长度为k
的所有组合:def kcomb(arr,i,thisarr,k):
thisarr = copy(thisarr)
j,n = len(thisarr),len(arr)
if n-i<k-j or j >k:
return
if j==k:
printarr(thisarr)
return
if i == n:
return
thisarr.append(arr[i])
kcomb(arr,i+1,thisarr,k)
del thisarr[-1]
kcomb(arr,i+1,thisarr,k)
return
这也是基于相同原理的。那么一般来说,如何找到这种函数的复杂度,以及如何对它们进行优化?可以通过DP完成吗?以下是第一个问题的示例输入输出:
>>> arr1 = ['a','b','c']
>>> arr2 = ['d','e','f']
>>> inter(arr1,arr2,0,0,[])
abcdef
abdcef
abdecf
abdefc
adbcef
adbecf
adbefc
adebcf
adebfc
adefbc
dabcef
dabecf
dabefc
daebcf
daebfc
daefbc
deabcf
deabfc
deafbc
defabc