字符串全排列的回溯法实现

问题描述:

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

      如下图所示,忽略紫色字体关于swap部分,因为这张图片中涉及的swap是另外一种思想的方法,而我这里是利用的不涉及swap的方法,只是借用这张图片进行描述。如果一个元素被访问过,则标记为红色。字符串包含几个元素那么数的高度就是几,这里包含A,B,C 3个元素,所以树的高度就是3。


结合ABC这个例子具体描述一下算法流程:

1) 在第一层,A是第一个未访问的元素,将A添加到输出队列,同时将A标记为红色(已访问);当前层level=1,不是最后一层,递归到第二层;

2) 在第二层,因为A已经访问过,所以B是第一个未访问过的元素,将B添加到输出队列,同时将B标记为红色(已访问),当前层level=2,不是最后一层,递归到第三层

3)在第三层,因为A,B都已经访问过,所以C是第一个未访问过的元素,将C添加到输出队列,同时将C标记为红色(已访问),当前层level=3,是最后一层;到达最后一层之后说明找到了一个排列ABC,将该排列输出;到达最后一层之后需要向前一层(第二层)回溯,在回溯之前需要将C标记为未访问,因为C是在当前层(第三层)访问的,而上一层(第二层)并没有访问,因此在回溯到第二层之前各元素的访问状态应该恢复到第二层的初始状态;

4)回溯到第二层之后,寻找第二个未访问过元素C,将C添加到输出队列,(注意:这里的C将会覆盖在第 2步中添加到队列的B,因为输出队列中元素的下标是level),同时将C标记为红色(已访问),当前层level=2,不是最后一层,递归到第三层。

5) 此时的第三层第一个未标记的元素是B,将B添加到输出队列,同时将B标记为红色(已访问),当前层为第三层是最后一层;到达最后一层之后说明又找到一个排列ACB,将该排列输出;接着再回溯到第二层,回溯到第二层之前,同样需要将C标记为未访问。

6)此时又回溯到第二层,第二层的第二,第三个元素都已经遍历过,即第二层此时不存在未遍历过的元素,此时需要回溯到第一层,同理,回溯到第一层直前,需要将A标记为未访问。

7) 此时回溯到第一层,寻找第二个未访问过的元素B,将B添加到输出队列,同时标记B为红色(已访问),下面的步骤和第2步中的做法一致。

8)到最后输出了每一个可能的排列。

# -*- coding:utf-8 -*-
#思路:回溯法,全排列问题
class Solution:
    def __init__(self):
        self.L=0
        self.data=[]
        self.used=[]   #标志某一个元素是否被访问过
        self.result=[]  #记录一个排列
        self.re=set()   #利用set记录全部排列,可去重
    def Permutation(self, ss):
        # write code here
        self.L=len(ss)
        if self.L == 0:
            return []
        else:
            self.data = ss
            self.used = [False] * self.L
            self.result = [0] * self.L
            self.PermutationHelper(1)
            return sorted(self.re)  # 保证输出的是字典序
    def PermutationHelper(self,level):
        for i in range(0,self.L):    #在每一层需要遍历全部元素
            if not self.used[i]:
                self.result[level-1]=self.data[i]
                self.used[i]=True
                if level!=self.L:
                    self.PermutationHelper(level+1)
                else:
                    self.re.add(''.join(self.result))
                self.used[i]=False





猜你喜欢

转载自blog.csdn.net/u011582757/article/details/79893137
今日推荐