classSolution: defpermutation(self, s: str) -> List[str]: """permutation with repeatable input :param nums: List[int] :return: List[List[int]] """ nums = list(s) ifnot nums: return [] # if not nums: return res = [] n = len(nums) visited = [False] * n
defbacktrack(path, depth): """backtrack based on extra space visted vector :param path: List[int] :param depth: int :return: None """ if depth == n: res.append(''.join(path[:])) for i inrange(n): if visited[i]: continue # 就加了这一句剪枝,那为什么要求visited[index-1]必须为False? # 因为一般回溯到这里时,前面visited[index-1]的占用可能没有被撤销。 # 所以要对 visited[index-1] 处进行检查。 if i > 0and nums[i] == nums[i-1] andnot visited[i-1]: continue visited[i] = True backtrack(path+[nums[i]], depth+1) visited[i] = False
# 由于要剪枝,所以必须要提前对nums进行排序,让重复的数字排列在一起。 nums.sort() backtrack([], 0) return res
# output ---------------------------------------------------------------------- Ran 1 test in0.142s OK