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 False

59#

括号生成。

生成合法括号序列,简单搜索。

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 ans

58#

组合总和。

找出列表里所有能组成目标数字的组合。每个数字能用无数次。

简单搜索。

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 ans

57#

电话号码的字母组合。

简单搜索。

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 ans

56#

子集。

返回所有可能的子集。简单搜索,每个元素选或不选。

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 ans

55#

全排列。

简单搜索。

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 ans

54#

实现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 True

53#

课程表。

课程之间有依赖关系,拓扑排序判有没有可能全部选上。

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 == numCourses

52#

腐烂的橘子。

多源的往外腐蚀,问最快的腐蚀所有橘子的时间。每个源都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 ans

51#

岛屿数量。

经典搜索。

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