一、要求
输入‘abc’
输出'a', 'ab', 'abc', 'ac', 'b', 'bc', 'c
注意:ab和ba属于不同的排列, 但属于同一个组合
二、思路及代码
举个例子:输入acbc 迭代的处理过程:
step1:排列一下acbc——abcc
step2:最外层for,及那个判重复操作(if i>0 and str[i]==str[i-1]),决定了排列结果只能是a,b,c开头,把这种单各的加到结果中
step3:对a开头处理:将一个a以后的字符串进行组合,结果为resresult,那么考虑到开头的a后,result为 a|a+resresult
step4: 迭代,迭代的返回点是只剩下一个字符len(string)==1
def group(string):#组合
if len(string)<=1:
return list(string)
str=list(string)
str.sort()
result=[]
for i in range(len(str)):#for i 的作用是排列时,以不同的字符开头,并且for+string[i+1:]的处理可以减少重复
if i>0 and str[i]==str[i-1]:
continue
result.append(str[i])#增加单个字符情况
resresult=group(''.join(str[i+1:]))
for j in resresult:
result.append(str[i]+j)
return result
print(group('abc'))
print(group('acbc'))
三、运行结果
['a', 'ab', 'abc', 'ac', 'b', 'bc', 'c']
['a', 'ab', 'abc', 'abcc', 'ac', 'acc', 'b', 'bc', 'bcc', 'c', 'cc']
四、思考与总结
这个好难啊,迭代的写法需要又要思考顶层(架构),又要思考底层(返回)