defsubsets(self, nums): defbacktrack(start, end, tmp): ans.append(tmp[:]) for i in range(start, end): tmp.append(nums[i]) backtrack(i+1, end, tmp) tmp.pop() ans = [] backtrack(0, len(nums), []) return ans
defsubsetsWithDup(self, nums): defbacktrack(start, end, tmp): ans.append(tmp[:]) for i in range(start, end): if i > start and nums[i] == nums[i-1]: continue tmp.append(nums[i]) backtrack(i+1, end, tmp) tmp.pop() ans = [] nums.sort() backtrack(0, len(nums), []) return ans
defgetPermutation(self, n, k): nums = [str(i) for i in range(1, n+1)] fact = [1] * n for i in range(1,n): fact[i] = i*fact[i-1] k -= 1 ans = [] for i in range(n, 0, -1): id = k / fact[i-1] k %= fact[i-1] ans.append(nums[id]) nums.pop(id) return''.join(ans)
defpartition(self, s): defbacktrack(start, end, tmp): if start == end: ans.append(tmp[:]) for i in range(start, end): cur = s[start:i+1] if cur == cur[::-1]: tmp.append(cur) backtrack(i+1, end, tmp) tmp.pop() ans = [] backtrack(0, len(s), []) return ans
defgeneratePalindromes(self, s): kv = collections.Counter(s) mid = [k for k, v in kv.iteritems() if v%2] if len(mid) > 1: return [] mid = ''if mid == [] else mid[0] half = ''.join([k * (v/2) for k, v in kv.iteritems()]) half = [c for c in half] defbacktrack(end, tmp): if len(tmp) == end: cur = ''.join(tmp) ans.append(cur + mid + cur[::-1]) else: for i in range(end): if visited[i] or (i>0and half[i] == half[i-1] andnot visited[i-1]): continue visited[i] = True tmp.append(half[i]) backtrack(end, tmp) visited[i] = False tmp.pop() ans = [] visited = [False] * len(half) backtrack(len(half), []) return ans
近期评论