本文實例講述了Python字符串的全排列算法。分享給大家供大家參考,具體如下:
題目描述
輸入一個字符串,按字典序打印出該字符串中字符的所有排列。例如輸入字符串a(chǎn)bc,則打印出由字符a,b,c所能排列出來的所有字符串a(chǎn)bc,acb,bac,bca,cab和cba。
輸入描述
輸入一個字符串,長度不超過9(可能有字符重復(fù)),字符只包括大小寫字母。
注意有可能重復(fù),因此需要判斷
注意list的append方法和list的+方法的區(qū)別
append方法在list后面添加元素
+方法在list后面添加list
如果使用append(list),那么list中所有的元素都會作為一項插入
swap函數(shù)將新的元素與之前的所有元素交換,返回一個列表,每一次交換都插入一個元素,因此是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: #處理重復(fù)情況 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: # 處理重復(fù)情況 #result.append(''.join(listElem)) result += ''.join(listElem) listElem[0], listElem[i] = listElem[i], listElem[0] return resultprint(swap('1', '234'))>>>>['1', '2', '3', '4', '2', '1', '3', '4', '3', '2', '1', '4', '4', '2', '3', '1']遞歸調(diào)用函數(shù)
這個地方要用+號,因為是加上每次調(diào)用的結(jié)果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) #這里返回的是一個數(shù)組,數(shù)組加數(shù)組使用+,數(shù)組加元素使用append符號 return result
按照字典排序
這里我按照冒泡字典排序,實際上沒有必要,比較字符大小直接可以用sorted函數(shù)。
sorted函數(shù)又方便又高效
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:
新聞熱點
疑難解答