20180723剑指offer题28扩展——字符串的组合

一、要求

输入‘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']

四、思考与总结

这个好难啊,迭代的写法需要又要思考顶层(架构),又要思考底层(返回)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值