剑指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