在此解决方案中,我找到了一种通过使用复数遍历四方邻居的新方法。
https://leetcode.com/problems/word-search-ii/discuss/59804/27-lines-uses-complex-numbers
(您可以阅读我的示例。)
我认为它优雅简洁,但我无法完全理解。
在这里,我提取了关键代码,并简化了示例。
board
是一个二维数组,我们要从每个节点开始,并通过dfs递归遍历4方向的neigbor:
这是一种常见的方式:
def dfs(i, j, word):
# create 4 direction by hand
for I, J in (i + 1, j), (i - 1, j), (i, j + 1), (i, j - 1):
# need to check boundary
if 0 <= I < len(board) and 0 <= J < len(board[0]):
dfs(I, J, word + c)
for i, j in board:
dfs(i, j, '')
这里使用复数作为索引:
board = {i + 1j * j: c
for i, row in enumerate(board)
for j, c in enumerate(row)}
def dfs(z, word):
c = board.get(z)
# here is visit 4 direction neighbors, which I don't understand
if c:
for k in range(4):
search(node[c], z + 1j ** k, word + c)
for z in board:
dfs(z, '')
我认为使用复数有两个优点:
但是我在这里for k in range(4): dfs(z + 1j ** k, word + c)
有人可以解释这个算法吗?非常感谢。
答案 0 :(得分:3)
如果我认为正确,那么此解决方案将使用虚数j
的以下属性:
如果将其添加到复数中以表示网格,则是以下节点:右,上,左,下