劍指offer 38 字串的排列(或數字全排列)

2021-10-23 00:09:26 字數 1063 閱讀 6549

輸入乙個字串,列印出該字串中字元的所有排列。

你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。

示例:輸入:s = "abc"

輸出:["abc","acb","bac","bca","cab","cba"]

思路:

選定乙個字元作為起始字元,其他字元全排列加到後面,所以顯然這是乙個遞迴問題。

解法一:排序去重

class solution(object):

def permutation(self, s):

""":type s: str

:rtype: list[str]

"""s = list(sorted(s))

res =

def dfs(s, tmp):

if not s:

return

for i, c in enumerate(s):

if i > 0 and s[i] == s[i-1]: # 去重

continue

dfs(s[:i] + s[i+1:], tmp + [c])

dfs(s, )

return res

解法二:set去重

class solution(object):

def permutation(self, s):

""":type s: str

:rtype: list[str]

"""n = len(s)

res = set() # 去重

def dfs(s, tmp):

if not s:

res.add(tmp)

return

for i, c in enumerate(s):

dfs(s[:i] + s[i+1:], tmp + c)

dfs(s, '')

return list(res)

參考:

劍指Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。例 輸入 abc 輸出 abc acb bac cab cba 長度為n的字串的排列若是集合s,其中一種排列的字串為 s2,sn s2 sn 再插入sn 1s sn 1 則有對於乙個字串有n 1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全...

劍指 Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba class solution boolean visited new boolean s.length dfs s,vis...

劍指 Offer 38 字串的排列

輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba 限制 1 s 的長度 8 通過次數30,289提交次數55,865 思路 回溯法。這道題應該這樣來理解,對於每乙個位置,在...