刚开始用Python刷题,记录一个踩坑
题目传送门
思路很简单,dfs+回溯,这里在用Python创建二维数组的时候,使用乘法直接创建,导致浅拷贝,在后续使用visited数组的时候出现了错误。
class Solution:
def dfs(self, board: List[List[str]], word: str, x: int, y: int, idx: int, vis) -> bool:
# idx: next index to match
if x >= 0 and y >= 0 and x < len(board) and y < len(board[0]) and vis[x][y] == False:
if board[x][y] != word[idx]:
return False
if idx == len(word) - 1:
return True
vis[x][y] = True
for dx, dy in [(1, 0), (-1, 0), (0, 1), (0, -1)]:
if self.dfs(board, word, x+dx, y+dy, idx+1, vis):
return True
vis[x][y] = False
return False
def exist(self, board: List[List[str]], word: str) -> bool:
# vis = [False] * len(board[0])
# vis = [vis] * len(board)
vis = [[False for i in range(len(board[0])) ] for j in range(len(board))]
for i in range(len(board)):
for j in range(len(board[0])):
if self.dfs(board, word, i, j, 0, vis):
return True
return False
使用注释部分的方法进行浅拷贝创建数组会出现错误,如下一个简单例子:
# 创建二维的bool数组
vis = [ False ] * 2
vis = [ vis ] * 3
vis
'''
output: [
[False, False],
[False, False],
[False, False]]
'''
# 赋值修改
vis[0][0] = True
vis
'''
output: [
[True, False],
[True, False],
[True, False]
]
'''
在进行修改操作的时候,y索引为0的一列都被修改了,这里属于创建了一个浅拷贝的数组,下面来看一下这个浅拷贝的变量地址:
# 创建二维的bool数组,内置函数id()返回变量的十进制地址位置
vis = [ False ] * 2
vis = [ vis ] * 3
# 输出每个元素的地址
for i in range(len(vis)):
for j in range(len(vis[0])):
print(f'[{i}][{j}]:{id(vis[i][j])}')
# 每个元素指向了同一个地址
'''
>>>
[0][0]:4303327472
[0][1]:4303327472
[1][0]:4303327472
[1][1]:4303327472
[2][0]:4303327472
[2][1]:4303327472
'''
# 赋值修改,之后再输出地址
vis[0][0] = True
'''
>>>
[0][0]:4303326744
[0][1]:4303327472
[1][0]:4303326744
[1][1]:4303327472
[2][0]:4303326744
[2][1]:4303327472
'''
发现修改的时候导致所有y索引0的元素都被修改了,这里对应的三个元素是创建数组的时候第二次的*3,修改的时候只能修改内层变量变化,而二次浅拷贝所有的引用此时也跟着变化了。