212. 单词搜索 II

给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

示例:

输入:
words = ["oath","pea","eat","rain"] and board =
[
['o','a','a','n'],
['e','t','a','e'],
['i','h','k','r'],
['i','f','l','v']
]

输出: ["eat","oath"]

思路: 字典树+dfs+剪枝(遇到word之后把cur.isWord = false,避免重复添加)
细节: 遇到word需要继续dfs,不应该回溯,否则会丢失结果。

class Solution {
    class TreeNode{
        boolean isWord;
        TreeNode[] children = new TreeNode[26];
        String word;
    }
    
    TreeNode root = new TreeNode();
    public void insert(String word){
        TreeNode cur = root;
        for(int i=0;i res = new ArrayList();
    public List findWords(char[][] board, String[] words) {
        // 构造字典树;
        for(String word:words){
            insert(word);
        }
        // dfs+剪枝
        int m = board.length;
        int n = board[0].length;
        for(int i=0;i=m||cury<0||cury>=n||mark[curx][cury]){continue;}
            dfs(board,curx,cury,cur,m,n,mark);
        }
        mark[i][j] = false;
    }
}

你可能感兴趣的:(212. 单词搜索 II)