劍指Offer 38 字串的排列

2021-09-09 07:42:50 字數 3129 閱讀 1672

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

例:

輸入:『abc』

輸出:『abc』, 『acb』, 『bac』, 『cab』, 『cba』

長度為n的字串的排列若是集合s,其中一種排列的字串為

,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...