欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

python字符串的排列代码实例讲解

程序员文章站 2022-06-17 10:14:22
字符串的排列 题目:输入一个字符串,打印出字符串的所有排列 基本思路:这个问题就是一个排列组合问题,使用python生成器可以很好的解决这个问题,将字符串进行迭代,每次迭代将一...

字符串的排列

题目:输入一个字符串,打印出字符串的所有排列

基本思路:这个问题就是一个排列组合问题,使用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