有重复字符串的排列组合

面试题08.08.有重复字符串的排列组合
输入:abcc
输出:[“abcc”,“acbc”,“accb”,“bacc”,“bcac”,“bcca”,“cabc”,“cacb”,“cbac”,“cbca”,“ccab”,“ccba”]

  1. 第一种方法:暴力,使用set
class Solution:
    def permutation(self, S: str) -> List[str]:
        if len(S) <= 1:
            return [S]
        def rec(s):
            if len(s) == 2:
                return [s[0]+s[1],s[1]+s[0]]
            res = []
            for i,ch in enumerate(s):
                res_list = rec(s[0:i]+s[i+1:])
                for r in res_list:
                    res.append(ch+r)
            res = list(set(res))
            return res
        return rec(S)
  1. 第二种方法:使用剪枝
    剪枝:循环遍历,每一字符都将作为排列组合的起始字符,以某一字符开始的排列组合,后面将不能有与其相同的开始,将相同的字符开始的情况过滤掉,也就是剪枝
class Solution:
    def permutation(self, S: str) -> List[str]:
        def rec(s):
            if len(s) == 1:
                return list(s)
            set_s = set()
            res_list = []
            for i, ch in enumerate(s):
                if ch in set_s:
                    continue
                set_s.add(ch)
                res = rec(s[0:i] + s[i+1:])
                l1 = list(map(lambda x: ch + x, res))
                res_list.extend(l1)
            return res_list
        if len(S) <= 1:
            return [S]
        return rec(''.join(list(sorted(S))))
  1. 第三种方法:使用python包itertools
import itertools 
class Solution:
    def permutation(self, S: str) -> List[str]:
        return [''.join(i) for i in set(itertools.permutations(S))]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值