1. 程式人生 > >【劍指offer】字串的全排列

【劍指offer】字串的全排列

題目描述

輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串abc,則打印出由字元a,b,c所能排列出來的所有字串abc,acb,bac,bca,cab和cba。
輸入描述

輸入一個字串,長度不超過9(可能有字元重複),字元只包括大小寫字母。


注意有可能重複,因此需要判斷
注意list的append方法和list的+方法的區別
append方法在list後面新增元素
+方法在list後面新增list
如果使用append(list),那麼list中所有的元素都會作為一項插入


swap函式將新的元素與之前的所有元素交換,返回一個列表,每一次交換都插入一個元素,因此是append方法

    def swap(self, newElem, Elem):
        result = []
        listElem = list(Elem)
        listElem.insert(0, newElem)
        result.append(''.join(listElem))
        for i in range(1, len(listElem)):
            preList = listElem[:]   #注意這個地方
            listElem[0], listElem[i] = listElem[i],
listElem[0] if listElem != preList: #處理重複情況 result.append(''.join(listElem)) listElem[0], listElem[i] = listElem[i], listElem[0] return result

如果使用+方法:

def swap(newElem, Elem):
    result = []
    listElem = list(Elem)
    listElem.insert(0, newElem)
#result.append(''.join(listElem)) result += ''.join(listElem) for i in range(1, len(listElem)): preList = listElem[:] # 注意這個地方 listElem[0], listElem[i] = listElem[i], listElem[0] if listElem != preList: # 處理重複情況 #result.append(''.join(listElem)) result += ''.join(listElem) listElem[0], listElem[i] = listElem[i], listElem[0] return result print(swap('1', '234')) >>>>['1', '2', '3', '4', '2', '1', '3', '4', '3', '2', '1', '4', '4', '2', '3', '1']

遞迴呼叫函式
這個地方要用+號,因為是加上每次呼叫的結果list(有多個元素),而不能append

    def recurtionPermutation(self, ss, index):
        result = []
        if index == 0:
            result.append(ss[0])
        else:
            previousList = self.recurtionPermutation(ss, index - 1)
            newElem = ss[index]
            #print(previousList)
            for Elem in previousList:
                result += self.swap(newElem, Elem)  #這裡返回的是一個數組,陣列加陣列使用+,陣列加元素使用append符號
        return result

按照字典排序
這裡我按照冒泡字典排序,實際上沒有必要,比較字元大小直接可以用sorted函式。
sorted函式又方便又高效

 def BubbleSortByDic(self, result):
        for i in range(len(result)):
            for j in range(len(result) - 1, i, -1):
                if result[j] < result[i]:
                    result[i], result[j] = result[j], result[i]
        return result

AC程式碼:

class Solution:
    def swap(self, newElem, Elem):
        result = []
        listElem = list(Elem)
        listElem.insert(0, newElem)
        result.append(''.join(listElem))
        for i in range(1, len(listElem)):
            preList = listElem[:]   #注意這個地方
            listElem[0], listElem[i] = listElem[i], listElem[0]
            if listElem != preList:   #處理重複情況
                result.append(''.join(listElem))
            listElem[0], listElem[i] = listElem[i], listElem[0]
        return result
    def recurtionPermutation(self, ss, index):
        result = []
        if index == 0:
            result.append(ss[0])
        else:
            previousList = self.recurtionPermutation(ss, index - 1)
            newElem = ss[index]
            #print(previousList)
            for Elem in previousList:
                result += self.swap(newElem, Elem)  #這裡返回的是一個數組,陣列加陣列使用+,陣列加元素使用append符號
        return result
    # def BubbleSortByDic(self, result):
    #     for i in range(len(result)):
    #         for j in range(len(result) - 1, i, -1):
    #             if result[j] < result[i]:
    #                 result[i], result[j] = result[j], result[i]
    #     return result
   def Permutation(self, ss):
        # write code here
        if ss == '':
            return []
        #return self.BubbleSortByDic(self.recurtionPermutation(ss, len(ss) - 1))
        return sorted(self.recurtionPermutation(ss, len(ss) - 1))
print(Solution().Permutation('acdfb'))