全排列
现场OJ真的是50%比拼智力,50%比拼题量。这种的题目一拿到手,智力强也得好好想想自己的做法是不是最优解。
最优解判断是个难题。
def all_range(st):
def recur(d, ans, cur,length):
if len(cur)==length:
ans.append(cur)
return
for i in d :
if d[i]<=0:
continue
d[i]-=1
recur(d, ans, cur + i,length)
d[i]+=1
d={}
for i in st:
if i in d:
d[i]+=1
else:
d[i]=1
ans=[]
cur=''
recur(d,ans,cur,len(st))
return ans
终结的方式:在递归最深处直接把结果扔到事先准备好的容器中。终结条件可要想好了,触底就返回。
取消重复的方式:在喂给下一层递归的时候,每种字符c只喂一次。里面的原理非常哲学。
时间复杂度:O(L*ANS),L代表字符串长度,ANS代表最终结果数量。
然后来了个新需求:非递归实现。
最好掌握一种通用的递归转非递归的套路。
还有一种想法:

浙公网安备 33010602011771号