组合问题
剪枝精髓是:for循环在寻找起点的时候要有一个范围,如果这个起点到集合终止之间的元素已经不够题目要求的k个元素了,就没有必要搜索了
组合总和问题
需要保证if len(self.path) == k:时一定要结束循环,犯的错误就是:
if len(self.path) == k and sum == n:self.res.append(self.path[:])return
这样的话如果递归到path满足要求时,如果sum不满足要求就会一直递归下去
应该是
if len(self.path) == k:if sum == n:self.res.append(self.path[:])return
电话号码的字母组合
要会搞hashmap,怎么把输入的数字转成字母
mapA = ['', '', 'abc','def', 'ghi', 'jkl', 'mno', 'pqrs', 'tuv', 'wxyz']
digitsA = []
for i in digits:digitsA.append(mapA[int(i)])
分割回文串
复原ip地址
for i in range(start, end + 1):if not s[i].isdigit(): # 遇到非数字字符不合法return Falsenum = num * 10 + int(s[i])if num > 255: # 如果大于255了不合法return False
maya这个判断isValid如果False直接break
for i in range(startIndex, len(s)):if self.isValid(s, startIndex, i):sub = s[startIndex:i + 1]pointNum += 1cur += (sub + '.')self.backTracking(s, pointNum, i + 1, cur)pointNum -= 1cur = cur[:-(i + 2 - startIndex)]else:break
全排列 II
maya这个used不论是used[i - 1] == false
还是used[i - 1] == true还是used[i - 1] == used[i]都行
递增子序列
如何利用set集合去重