[剑指Offer]字符串排列问题[Python]

题目描述:输入一个字符串,按字典序打印出该字符串中字符的所有排列。例如输入字符串abc,则打印出由字符a,b,c所能排列出来的所有字符串abc,acb,bac,bca,cab和cba。

解题思路:这道题想的时候思路来的还挺快的,但是真的写了很久,有一些用法还不太熟悉,得一点一点地查找.

如,输入abc,则思路如下:即将元素左右空都设置成#,则新来一个字符只要插空就行了.如果

                                                            #a#

                                           #b#a#               #a#b#

         #c#b#a#  #b#c#a#   #b#a#c#               #c#a#b#   #a#c#b#    #a#b#c#

代码:

class Solution:
    def AppendSym(self,c):
        return '#'+c+'#'

    def Iter(self,ss,stack1,stack2):

       #本来想只用一个stack,但是后来发现越想越乱,控制不好循环的结束条件,所以用了两个栈

        if ss:

            #提取待插入的字符串'#a#'

            str_ss = ss.pop(0)

            #现存的要插入的字符串

            while stack1:

                str_list = list(stack1.pop(0))

                #将字符串里的#分别换成str_ss

                index = [i for i, val in enumerate(str_list) if val == '#']
                for i in index:
                    str_list[i] = str_ss
                    stack2.append(''.join(str_list)) #将生成的list连接成string

                    str_list[i] = '#' #还原原来的list,要不然stack1中的下一个 要插入的字符串就不对应了,因为list已经变了

   #新生成的要插入的字符串

            self.Iter(ss,stack2,stack1)  #递归方法
            if stack1:
                return stack1
            else:
                return stack2
    def Permutation(self, ss):
        stack1 = []
        stack2 = []

        if ss:

            #这几步的想法是把字符串中的每一个字符都变成'#a#'的形式

            ss = list(ss) #没找到在字符串中一次性插值的函数,所以就把它变成list
            ss = map(self.AppendSym,ss)
            stack1.append(ss.pop(0))
            res_list = self.Iter(ss,stack1,stack2) #进入子函数递归
            if res_list:
                res_list = [i.replace('#','') for i in res_list]
                res_list = list(set(res_list))
                res_list.sort() #因为要按字典顺序输出,所以要sort一下
            else:
                res_list = [i.replace('#', '') for i in stack1]
                res_list = list(set(res_list))
            return res_list
        else:

            return []


看到牛友上有人给出了这样的答案,感慨python内嵌函数的伟大:

import itertools
class Solution:
    def Permutation(self, ss):
        res = []
        if not ss:
            return res
        s = sorted(ss)
        num = len(s)
        for i in itertools.permutations(s,num):
            res.append(''.join(i))
        return sorted(list(set(res))) #去掉重复元素并排序
        a = 1

猜你喜欢

转载自blog.csdn.net/jillian_sea/article/details/80355769
今日推荐