private void SearchDfs(char[,] board, EngishTrieNodeSimple node, List <string> result, int row, int col, bool[,] used) { //如果当前node的word不为空,说明board里走的路径形成的单词,在字典树里找到了,要加入结果集 //不过可能2条路径形成的单词一样,所以要把单词设定成空(其实感觉判断结果集是否包含单词逻辑是一样的,而且不用写个新的EngishTrieNodeSimple,但是words数量多的时候,性能应该不如给字典树加word属性 //找到单词还是要继续循环,就好比字典有ab还有abc和abd,必须等到node的children里找不到当前字符才结束 if (node.Word != null) { result.Add(node.Word); node.MakeNull(); } EngishTrieNodeSimple curr; used[row, col] = true; //向右走 if (row < board.GetLength(0) - 1 && used[row + 1, col] == false && node.TryGet(board[row + 1, col], out curr)) { SearchDfs(board, curr, result, row + 1, col, used); } //向左走 if (row > 0 && used[row - 1, col] == false && node.TryGet(board[row - 1, col], out curr)) { SearchDfs(board, curr, result, row - 1, col, used); } //向下走 if (col < board.GetLength(1) - 1 && used[row, col + 1] == false && node.TryGet(board[row, col + 1], out curr)) { SearchDfs(board, curr, result, row, col + 1, used); } //向上走 if (col > 0 && used[row, col - 1] == false && node.TryGet(board[row, col - 1], out curr)) { SearchDfs(board, curr, result, row, col - 1, used); } used[row, col] = false; }
public WordSearch2() { Root = new EngishTrieNodeSimple(); }