字符串的排列-牛客
思路
- 递归+回溯
1)终止条件:临时字符串长度==原字符串长度,已经形成了一种排列情况了,可以将其加入输出数组中。
2)返回值:每一层给上一层返回的就是本层级在临时字符串中添加的元素,递归到末尾的时候就能添加全部元素。
3)本级任务:每一级都需要选择一个未使用的元素加入到临时字符串末尾(遍历原字符串选择)
#
# 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
#
#
# @param str string字符串
# @return string字符串一维数组
#
class Solution:
def recursion(self, res:List[str], string:str, temp:str, vis:List[int]):
#临时字符串满了加入输出
if len(temp) == len(string):
res.append(temp)
return
#遍历所有元素选取一个加入
for i in range(len(string)):
#如果该元素已经被加入了则不需要再加入了
if vis[i]==1:
continue
if i > 0 and string[i - 1] == string[i] and not vis[i - 1]:
#当前的元素str[i]与同一层的前一个元素str[i-1]相同且str[i-1]已经用过了
continue
#标记为使用过
vis[i] = 1
#加入临时字符串
temp += string[i]
self.recursion(res, string, temp, vis)
#回溯
vis[i] = 0
temp = temp[:-1]
def Permutation(self , str: str) -> List[str]:
if len(str)==0:
return []
#先按字典序排序,使重复字符串相邻
str ="".join((lambda x:(x.sort(),x)[1])(list(str)))
#标记每个位置的字符是否被使用过
vis = [0]*len(str)
res = []
temp = ""
#递归获取
self.recursion(res, str, temp, vis)
return res
//标记为使用过
vis[i] = 1;
//加入数组
temp.add(num[i]);
self.recursion(res, num, temp, vis);
//回溯
vis[i] = 0;
temp.pop();