993 words
5 minutes
日拱两卒(五)
2026-07-23
60
单词搜索。
在一个二维矩阵里找单词,简单搜索。
class Solution: def exist(self, board: List[List[str]], word: str) -> bool: n = len(board) m = len(board[0]) st = [[False for _ in range (m)] for _ in range (n)] dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def dfs(x, y, u) -> bool: if word[u] != board[x][y]: return False if u == len(word) - 1: return True st[x][y] = True ok = False for i in range(4): tx = x + dx[i] ty = y + dy[i] if tx < 0 or tx >= n or ty < 0 or ty >= m: continue if st[tx][ty]: continue ok |= dfs(tx, ty, u + 1) st[x][y] = False return ok
for i in range(n): for j in range(m): if dfs(i, j, 0): return True return False59
括号生成。
生成合法括号序列,简单搜索。
class Solution: def generateParenthesis(self, n: int) -> List[str]: ans = [] s = ['.' for _ in range (2 * n)] def dfs(u, left, right): if u == 2 * n: ans.append(''.join(s)) return
if left < n: s[u] = '(' dfs(u + 1, left + 1, right) s[u] = '.'
if right < left: s[u] = ')' dfs(u + 1, left, right + 1) s[u] = '.'
dfs(0, 0, 0) return ans58
组合总和。
找出列表里所有能组成目标数字的组合。每个数字能用无数次。
简单搜索。
class Solution: def combinationSum(self, candidates: List[int], target: int) -> List[List[int]]: ans = [] tmp = []
def dfs(u, cur): if cur > target: return if cur == target: ans.append(tmp[:]) return for i in range(u, len(candidates)): tmp.append(candidates[i]) dfs(i, cur + candidates[i]) tmp.pop()
dfs(0, 0) return ans57
电话号码的字母组合。
简单搜索。
class Solution: def letterCombinations(self, digits: str) -> List[str]: mapping = {2: 'abc', 3: 'def', 4: 'ghi', 5: 'jkl', 6: 'mno', 7: 'pqrs', 8: 'tuv', 9: 'wxyz'} ans = [] n = len(digits) tmp = []
def dfs(u): if u >= n: ans.append(''.join(tmp[:])) return letters = mapping[int(digits[u])] for letter in letters: tmp.append(letter) dfs(u + 1) tmp.pop()
dfs(0) return ans56
子集。
返回所有可能的子集。简单搜索,每个元素选或不选。
class Solution: def subsets(self, nums: List[int]) -> List[List[int]]: ans = []
n = len(nums) tmp = []
def dfs(u): if u >= n: ans.append(tmp[:]) return
dfs(u + 1)
tmp.append(nums[u]) dfs(u + 1) tmp.pop()
dfs(0) return ans55
全排列。
简单搜索。
class Solution: def permute(self, nums: List[int]) -> List[List[int]]: ans = [] n = len(nums)
tmp = [] st = [False for _ in range(n)] def dfs(u): if u >= n: ans.append(tmp[:]) return for i in range(n): if st[i]: continue
st[i] = True tmp.append(nums[i])
dfs(u + 1)
tmp.pop() st[i] = False
dfs(0) return ans54
实现Trie。
class Node: __slots__ = 'son', 'end'
def __init__(self): self.son = [None] * 26 self.end = False
class Trie:
def __init__(self): self.root = Node()
def insert(self, word: str) -> None: cur = self.root for c in word: c = ord(c) - ord('a') if cur.son[c] is None: cur.son[c] = Node() cur = cur.son[c] cur.end = True
def search(self, word: str) -> bool: cur = self.root for c in word: c = ord(c) - ord('a') if cur.son[c] is None: return False cur = cur.son[c] return cur.end
def startsWith(self, prefix: str) -> bool: cur = self.root for c in prefix: c = ord(c) - ord('a') if cur.son[c] is None: return False cur = cur.son[c] return True53
课程表。
课程之间有依赖关系,拓扑排序判有没有可能全部选上。
class Solution: def canFinish(self, numCourses: int, prerequisites: List[List[int]]) -> bool: e = [[] for _ in range(numCourses)] in_degree = [0 for _ in range(numCourses)]
for edge in prerequisites: e[edge[1]].append(edge[0]) in_degree[edge[0]] += 1
q = deque([i for i in range(numCourses) if in_degree[i] == 0]) visited = 0
while q: u = q.popleft() visited += 1 for v in e[u]: in_degree[v] -= 1 if in_degree[v] == 0: q.append(v)
return visited == numCourses52
腐烂的橘子。
多源的往外腐蚀,问最快的腐蚀所有橘子的时间。每个源都BFS一遍。
class Solution: def orangesRotting(self, grid: List[List[int]]) -> int: n, m = len(grid), len(grid[0])
for i in range(n): for j in range(m): if grid[i][j] == 0: grid[i][j] = -1 elif grid[i][j] == 1: grid[i][j] = float("inf") else: grid[i][j] = 0
dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] q = deque()
for i in range(n): for j in range(m): if grid[i][j] == 0: q.append((i, j))
while q: x, y = q.popleft() for i in range(4): tx = x + dx[i] ty = y + dy[i] if tx < 0 or tx >= n or ty < 0 or ty >= m: continue if grid[tx][ty] < grid[x][y] + 1: continue grid[tx][ty] = grid[x][y] + 1 q.append((tx, ty))
ans = 0 for i in range(n): for j in range(m): if grid[i][j] == float("inf"): return -1 if grid[i][j] != -1: ans = max(ans, grid[i][j])
return ans51
岛屿数量。
经典搜索。
class Solution: def numIslands(self, grid: List[List[str]]) -> int: n, m = len(grid), len(grid[0])
dx = [-1, 1, 0, 0] dy = [0, 0, -1, 1] def dfs(x, y): grid[x][y] = '0' for i in range(4): tx = x + dx[i] ty = y + dy[i] if tx < 0 or tx >= n or ty < 0 or ty >= m: continue if grid[tx][ty] == '0': continue dfs(tx, ty)
ans = 0 for i in range(n): for j in range(m): if grid[i][j] == '1': ans += 1 dfs(i, j)
return ans