哈哈,我又来了,这次又碰到一个引用传递的坑。话不多说,上代码。
const findWords = (board, words) => {
const m = board.length, n = board[0].length;
const maxLen = words.reduce((prev, cur) => Math.max(prev, cur.length), 0);
let flagBoard = new Array(m * n).fill(false); //不能用矩阵,只能一维数组,不然报错,为什么?
const insert = (i, j, dep, node) => {
/* console.log(flagBoard); */
if(dep == 0) return;
if(i < 0 || j < 0 || i >= m || j >= n) return;
if(flagBoard[i * n + j]) return;
console.log(flagBoard);
flagBoard[i * n + j] = true;
console.log(flagBoard);
const c = board[i][j];
node = node[c] = node[c] || {};
insert(i + 1, j, dep - 1, node);
insert(i - 1, j, dep - 1, node);
insert(i, j + 1, dep - 1, node);
insert(i, j - 1, dep - 1, node);
flagBoard[i * n + j] = false;
};
const buildTrie = () => {
let root = {};
for(let i = 0; i < m; i++){
for(let j = 0; j < n; j++){
insert(i, j, maxLen, root);
}
}
return root;
}; //板子的插入不同于之前的words,需要DFS插入所有情况
let trie = buildTrie();
const search = (word) => {
let node = trie;
for(const c of word){
if(!node[c]) return false;
node = node[c];
}
return true;
};
return words.filter(word => search(word));
};
该代码是LC-212的题解,注意看代码中的有一行注释:不能用矩阵,只能一维数组,不然报错,为什么?
说的啥意思呢,就是你不能写new Array(m).fill(new Array(n).fill(false));
哈哈,应该有很多朋友喜欢偷懒这样写矩阵吧?
那么你是否知道这种写法会有一个小问题呢?
我本来也不知道,是在debug半天后才发现问题所在,最后改成一维数组,利用index = i * n + j这种写法逻辑上表达矩阵位置,这样才AC了题目。
我直接把代码的问题拿一个例子说明:
let a = new Array(4).fill(new Array(4).fill(false));
let b = a[0];
console.log(a, b);
b[0] = true;
console.log(a, b);
打印结果:
我靠,什么情况,我看这个代码,a是个4*4的矩阵,b是a的第一行,那么b[0] = true;的话,应该就第一行是[ true, false, false, false ]这种啊,怎么每行都变这样了啊。
哼哼,这就是问题所在,你在写new Array(m).fill(new Array(n).fill(false));的时候很爽吧,可是第一个fill的括号中的东西可都是引用到同一个实际物理对象噢,所以你改一行,所有行全会变,懂了吧。