劍指offer:字符串的排列(Python)

題目描述

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

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

解題思路

化複雜爲簡單,如何找到解這道題的通式呢?和青蛙跳臺階的思路一樣,無論給定的字符串長度多少,其排列出來的組合樣式均可以分解爲“第一個字符+剩下的字符”的樣式。可以通過遍歷分別賦予第一位上不同的字符,那“剩下的字符”又可以如上分解。順着這個思路,寫出草稿:

def Permutation(self, ss):
    if not ss:
        print(",")
    for i in range(len(ss)):
        print(ss[i],end="")
        self.Permutation(ss[:i]+ss[i+1:])

如上代碼就是基本思路的體現,得益於Python代碼的特性,在隊字符串做切片操作時,當索引位置超出長度,python不會報錯,而只是跳過本次切取。外加Python字符串簡潔的拼接語句,所以代碼相當的短。結果的輸出如下:

abc,
cb,
bac,
ca,
cab,
ba,

接下來就需要有列表來“兜住”這些值,並需要補全每個循環中返回的殘缺的字符串的頭部。所以,接下來map()函數了解一下~~【點擊這裏瞭解map函數】
因爲map函數返回的是一個序列,所以需要調用for循環來獲取序列中每一個元素。如果給定的字符串不包含重複元素,或者雖然包含重複元素,將重複的每個元素看做互不相同的獨立的元素的話,以下代碼可以滿足需求:

def Permutation(self, ss):
    res = []
    if len(ss) <= 1:
        return ss
    for i in range(len(ss)):
        for n in map(lambda x:ss[i] + x, self.Permutation(ss[:i] + ss[i + 1:])):
            res.append(n)
    return res

當需要考慮重複元素時,加一個判斷即可。

def Permutation(self, ss):
    list = []
    if len(ss) <= 1:
        return ss
    for i in range(len(ss)):
        for j in map(lambda x: ss[i]+x, self.Permutation(ss[:i]+ss[i+1:])):
            if j not in list:
                list.append(j)
    return list

很遺憾,最後這段代碼的思路不是我想出來的… 。這段代碼利用Python字符串的特性,在map函數中對返回的序列中每個元素進行拼接操作,不斷返回已經拼接好了的字符串的後半部分,看的真是賞心悅目~~

發佈了85 篇原創文章 · 獲贊 103 · 訪問量 23萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章