题解
思路
先依次排好所有不重复的字符的位置顺序,再依次考虑剩余的重复字符的位置顺序,排完一遍所有字符则得到一种唯一的排列
代码
class Solution:
### 1107 回溯法(104 ms 18.7 MB)
### 思想:先依次排好所有不重复的字符的位置顺序,再依次考虑剩余的重复字符的位置顺序,排完一遍所有字符则得到一种唯一的排列
def permutation(self, s: str) -> List[str]:
c_ls, res = list(s), [] # c_ls中字符的位置会根据dfs的运行情况发生变化,但其字符数量不变
def dfs(x: int) -> None:
if x == len(s) - 1: # 当前字符c_ls[x]是否是最后一个字符,若是则只存在唯一情况,则直接返回当前排列
res.append(''.join(c_ls)) # 记录当前递归所形成的唯一排列
return
c_set = set() # 每次递归都定义一个集合c_set,用于存放在本次递归中、x之前的、已经固定好的字符的集合
for i in range(x, len(s)): # 循环从本次递归的起始字符下标x开始,到字符串中的最后一个字符
if c_ls[i] in c_set: continue # 若当前字符和之前已有的字符串中的字符相同,则跳过当前字符,判断下一个字符
c_set.add(c_ls[i]) # 若当前字符和之前不重复,则添加进本次的字符集合c_set中,用来记录已经使用的字符
c_ls[i], c_ls[x] = c_ls[x], c_ls[i] # 交换当前字符c_ls[i]和本次递归的起始字符c_ls[x],用于固定当前字符c_ls[i](占位),以便确定最后的排列
dfs(x+1) # 使用递归固定下一个字符c_ls[x+1]
c_ls[i], c_ls[x] = c_ls[x], c_ls[i] # 当前字符c_ls[i]占位结束,则交换回原来的位置,保证原有的顺序
dfs(0) # 从第一个字符开始依次固定后面的每一位字符,每固定完一遍所有字符,则得到一种唯一情况,并使用join方法生成字符串保存在res中
return res