212. 单词搜索 II

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/word-search-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。


逻辑没有变,只不过多了单词而已,多加一个循环。但是这样慢,trie树更好。


class Solution {
    private TrieNode root = new TrieNode();
    private List<String> ret = new ArrayList<>();
    public List<String> findWords(char[][] board, String[] words) {
        // 构建trie结构
        buildTrie(words);
        for(int i=0;i<board.length;i++) {
            for(int j=0;j<board[0].length;j++) {
                if(root.children.containsKey(board[i][j])) {
                      dfs(board,i,j, root);
                }
            }
        }
        return ret;
    }

    private void buildTrie(String[] words) {
        for(String str : words) {
            TrieNode cur= root;
            for(int i=0;i<str.length();i++) {
                char c = str.charAt(i);
                if(!cur.children.containsKey(c)) {
                    cur.children.put(c,new TrieNode());
                }
                cur = cur.children.get(c);
            }
            cur.word = str;
        }
    }

    private void dfs(char[][] board, int i,int j, TrieNode node) {
        if(i<0||i>=board.length || j<0||j>=board[0].length || board[i][j] == '.') {
            return; 
        }
        char c = board[i][j];
        TrieNode next = node.children.get(c);
        if(next == null) {
            return;
        }

        if(next.word !=null) {
            ret.add(next.word);
            next.word = null;
        }
      
        board[i][j] = '.';
        dfs(board,i+1,j,next);
        dfs(board,i-1,j,next);
        dfs(board,i,j+1,next);
        dfs(board,i,j-1,next);
        board[i][j] = c;
    }

     
}

class TrieNode {
    String word;
    Map<Character,TrieNode> children = new HashMap<>();
    public TrieNode(){}
}
posted @ 2022-03-01 11:36  一颗青菜  阅读(7)  评论(0)    收藏  举报