Example #1
0
        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;
        }
Example #2
0
 public WordSearch2()
 {
     Root = new EngishTrieNodeSimple();
 }