Python解LeetCode单词搜索题时报无法给矩阵单元格赋值字符串错误
问题根因分析
你遇到的报错完全是传参错误导致的,和数组拷贝是否深浅没有直接关系,看你代码里向右搜索的递归调用行:
if j + 1 < len(board[0]) and board[i][j + 1] == word[0]: return is_word(board.copy()[i], word[1:], i, j + 1)
这里你错误传入了board.copy()[i]作为is_word的第一个参数:
- 原
board是二维数组,board.copy()[i]是取拷贝后数组的第i行,是一维数组 - 进入下一层递归后,执行
board[i][j] = "."时,board已经是一维结构,board[i]对应的就是单个字符串元素,而字符串是不可变类型,不支持元素赋值,自然抛出你遇到的TypeError: 'str' object does not support item assignment错误。 - 首次运行正常是因为第一次调用
is_word时传入的是完整二维数组,还没走到错误的传参分支。
其他隐性问题
- 浅拷贝问题:
list.copy()是浅拷贝,对二维数组来说,只拷贝了外层列表容器,内层的每一行还是和原数组共享引用,你修改board[i][j]会影响其他递归分支的判断,要么改用copy.deepcopy()做深拷贝,要么更高效的方案是用回溯逻辑,不需要每次传数组拷贝:
# 回溯核心逻辑参考 tmp = board[i][j] board[i][j] = "." # 四个方向递归判断结果 res = 四个方向递归判断... board[i][j] = tmp # 回溯改回原值,不影响其他分支 return res
- 边界判断顺序错误:你现在先修改
board[i][j]再判断len(word) == 0,顺序反了,最后一个字符匹配时会直接返回,漏处理最后一步的匹配校验。
修复方案
先把错误的传参改对即可解决当前报错:
if j + 1 < len(board[0]) and board[i][j + 1] == word[0]: return is_word(board.copy(), word[1:], i, j + 1)
内容的提问来源于stack exchange,提问作者Eldar Tailov
相关产品推荐
相关产品推荐

