classSolution: defmaximumRows(self, matrix: List[List[int]], numSelect: int) -> int: row_sum = [sum(r) for r in matrix] ans = 0 n = len(matrix[0]) m = len(matrix)
defdfs(col:int, left_num:int): nonlocal ans, row_sum if left_num == 0or col == n: # 要么不能选列,要么已经到了边缘 ans = max(ans, row_sum.count(0)) print(row_sum) return dfs(col+1, left_num) # 当前列不选
recover_index = [] for row_index inrange(m): if matrix[row_index][col] == 1: row_sum[row_index] -=1 recover_index.append(row_index)
dfs(col+1, left_num-1) # 选
for row_index in recover_index: row_sum[row_index] += 1
classSolution: defmaxLength(self, arr: List[str]) -> int: ans = 0 rec = set() n = len(arr) defdfs(index:int): nonlocal ans, rec if index == n: ans = max(ans, len(rec)) return dfs(index+1) # 不选
cur_s = arr[index] can_put_in = True ori_rec = rec.copy() for c in cur_s: if c in rec: can_put_in = False break rec.update(c) if can_put_in: # print(rec) dfs(index+1) rec = ori_rec dfs(0) return ans
PRE_SUM = [0]*1001 for i inrange(1, 1001): s = str(i*i) n = len(s) defdfs(index:int, cur_sum:int): if index == n: return cur_sum == i accumulate_num = 0 for j inrange(index,n): num = int(s[j]) accumulate_num = accumulate_num*10 + num if dfs(j+1, cur_sum+accumulate_num): returnTrue returnFalse PRE_SUM[i] = PRE_SUM[i-1] + (int(s) if dfs(0, 0) else0)
classSolution: defrestoreIpAddresses(self, s: str) -> List[str]: ans = [] cur = [] n = len(s) proper_ip_len = n+3
defdfs(index:int, phase_cnt:int): nonlocal ans, cur if index == n or phase_cnt == 4: tmp = '.'.join(cur) # print(tmp) iflen(tmp) == proper_ip_len: ans.append(tmp) return
for i inrange(index, min(index+3, n)): cur_s = s[index:i+1] iflen(cur_s) > 1and s[index]=="0": break# 有前置零,后面都不用考虑了 num = int(cur_s) if num > 255: # 最后一个循环数字过大 break cur.append(cur_s) dfs(i+1, phase_cnt+1) cur.pop()