【劍指offer】字串的全排列
阿新 • • 發佈:2018-11-26
題目描述
輸入一個字串,按字典序打印出該字串中字元的所有排列。例如輸入字串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'))