python 字符串的排列

剑指offer第38题:字符串的排列

题目:输入一个字符串,打印出字符串的所有排列
基本思路:这个问题就是一个排列组合问题,使用python生成器可以很好的解决这个问题,将字符串进行迭代,每次迭代将一个字符加入到新的字符串当中,并且将这个字符的序列记录到元组state中,这个元组可以用来判断之前是否添加过某个字符!
拓展:八皇后问题也是这样的原理!

# 献上代码
# _*_ encoding:utf-8 _*_
class Solution:

    def string_arrange(self, string):
        if not string:
            return
        # 用一个集合set来保存返回的字符串 
        string_set = set()
        for arrange_list in self.arrangement(string):
            string_set.add(arrange_list)
        return list(string_set)

    def arrangement(self, string, state=()):
        """
        字符串生成器
        通过用state来记录当前的字符串已经使用了哪些位置(index)的字符串
        """
        for index, char in enumerate(string):
            if not self.conflict(index, state):
                if len(state) == len(string) - 1:
                    yield char
                for result in self.arrangement(string, state + (index,)):
                    yield char + result

    def conflict(self, index, state):
        """
        判断当前字符串序列index是否存在于state的当中
        如果存在:矛盾,返回True
        否则,返回False
        """
        if not state:
            return False

        if index in state:
            return True
        return False


if __name__ == '__main__':
    # 测试用例
    solution = Solution()
    string_list = ['', 'a', 'abc', 'abcda', None]
    for string in string_list:
        string_arrange = solution.string_arrange(string)
        if string_arrange:
            print len(string_arrange), 
        print string_arrange
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值