輸入乙個字串,列印出該字串中字元的所有排列。
例:
輸入:『abc』長度為n的字串的排列若是集合s,其中一種排列的字串為輸出:『abc』, 『acb』, 『bac』, 『cab』, 『cba』
,s2,
...,
sn
>
,s2
,..
.,sn
>
,再插入sn+
1s_
sn+1
,則有對於乙個字串有n+1個插入位置。因此,解題思路就是每次遞迴加入乙個字元,直到字串全部被加入遞迴結束。每次遞迴中都有n+1種插入分支。
時間複雜度:o(n!),t(n) = t(n-1) + t(n-1)*o(n)
空間複雜度:o(n^2),o(n)的遞迴深度,每次遞迴傳入o(n)的字串。
書上的解法不使用插入,而是用了交換,實際上是一樣的。但是由於是對同乙個列表操作,而不是傳入新的列表分片,減小了空間複雜度。
時間複雜度:o(n!)
空間複雜度:o(n)
def
string_permutation
(string)
:"""
:param string:string
:return: permutation list
"""defrecursion_core
(pre_s, string)
:"""
:param pre_s: n-1 sol
:param string: str waiting to add
:return: n sol
"""ifnot string:
return
for s in
range
(len
(string)):
recursion_core(pre_s + string[s]
, string[
:s]+string[s+1:
])ans =
recursion_core(
'', string)
return ans
def
string_permutation_2
(string)
:"""
:param string: string
:return: permutation list
"""defrecursion_core
(string, start)
:"""
:param string: total string
:param start: all permutation of string[start:]
:return:
"""if start ==
len(string):''
.join(string)
)else
:for i in
range
(start,
len(string)):
string[i]
, string[start]
= string[start]
, string[i]
recursion_core(string, start+1)
string[i]
, string[start]
= string[start]
, string[i]
comb =
recursion_core(
list
(string),0
)return comb
給定乙個沒有重複數字的序列,返回其所有可能的全排列。
示例:
輸入: [1,2,3]輸出:[
[1,2,3],
[1,3,2],
[2,1,3],
[2,3,1],
[3,1,2],
[3,2,1]
]
class
solution
:def
permute
(self, nums)
:"""
:type nums: list[int]
:rtype: list[list[int]]
"""defrecursion_core
(element, start)
:if start ==
len(element)::
])else
:for i in
range
(start,
len(element)):
element[i]
, element[start]
= element[start]
, element[i]
recursion_core(element, start +1)
element[i]
, element[start]
= element[start]
, element[i]
comb =
recursion_core(nums,0)
return comb
defpermute_2
(self, nums)
:"""
:type nums: list[int]
:rtype: list[list[int]]
"""defrecursion_core
(pre_s, string):if
not string:
return
for s in
range
(len
(string)):
recursion_core(pre_s +
[string[s]
], string[
:s]+ string[s +1:
])ans =
recursion_core(
, nums)
return ans
劍指 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 思路 回溯法。這道題應該這樣來理解,對於每乙個位置,在...
劍指 Offer 38 字串的排列
輸入乙個字串,列印出該字串中字元的所有排列。你可以以任意順序返回這個字串陣列,但裡面不能有重複元素。示例 輸入 s abc 輸出 abc acb bac bca cab cba 限制 1 s 的長度 8 1 最蠢的遞迴 class solution public void f string s,st...