回溯算法总结

组合问题

剪枝精髓是: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 False
            num = 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 += 1
                cur += (sub + '.')
                self.backTracking(s, pointNum, i + 1, cur)
                pointNum -= 1
                cur = cur[:-(i + 2 - startIndex)]
            else:
                break

全排列 II

maya这个used不论是used[i - 1] == false还是used[i - 1] == true还是used[i - 1] == used[i]都行

递增子序列

如何利用set集合去重

你可能感兴趣的:(算法)