題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串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
函數中對返回的序列中每個元素進行拼接操作,不斷返回已經拼接好了的字符串的後半部分,看的真是賞心悅目~~