{AAB}
class Solution:
def __init__(self):
self.path = ''
self.paths = []
def numTilePossibilities(self, nums):
'''
因为本题排列是有序的,这意味着同一层的元素可以重复使用,但同一树枝上不能重复使用(usage_list)
所以处理排列问题每层都需要从头搜索,故不再使用start_index
'''
usage_list = [False] * len(nums)
self.backtracking(nums, usage_list)
return len(self.paths)
def backtracking(self, nums,usage_list):
# Base Case本题求叶子节点
if len(self.path) == len(nums):
if self.path not in self.paths:
self.paths.append(self.path)
# 单层递归逻辑
for i in range(0, len(nums)): # 从头开始搜索
# 若遇到self.path里已收录的元素,跳过
if usage_list[i] == True:
continue
usage_list[i] = True
self.path=self.path+nums[i]
if self.path not in self.paths:
self.paths.append(self.path)
self.backtracking(nums, usage_list) # 纵向传递使用信息,去重
self.path=self.path[:-1]
usage_list[i] = False