212. 单词搜索 II

Posted 潜行前行

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了212. 单词搜索 II相关的知识,希望对你有一定的参考价值。

  1. 单词搜索 II
    给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words, 返回所有二维网格上的单词 。

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

示例 1:

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

关键点

  • 回溯 + trie树剪枝

代码

class TrieNode
    String s;
    TrieNode[] childs = new TrieNode[26];

class Solution 
    Set<String> set = new HashSet<>();
    int[][] dirs = new int[][]1,0,-1,0,0,1,0,-1;
    boolean[][] visited = new boolean[15][15];
    public List<String> findWords(char[][] board, String[] words) 
        for (String w : words) insert(w);
        for (int i = 0; i < board.length; i++) 
            for (int j = 0; j < board[0].length; j++) 
                int k = board[i][j] - 'a';
                if (root.childs[k] != null) 
                    visited[i][j] = true;
                    dfs(i, j, root.childs[k],board);
                    visited[i][j] = false;
                
            
        
        List<String> ans = new ArrayList<>();
        for (String s : set) ans.add(s);
        return ans;
    
    void dfs(int i, int j, TrieNode node, char[][] board) 
        if (node.s != null) set.add(node.s);
        for (int[] d : dirs) 
            int dx = i + d[0], dy = j + d[1];
            if (dx < 0 || dx >= board.length || dy < 0 || dy >= board[0].length) continue;
            if (visited[dx][dy]) continue;
            int u = board[dx][dy] - 'a';
            if (node.childs[u] != null) 
                visited[dx][dy] = true;
                dfs(dx, dy, node.childs[u],board);
                visited[dx][dy] = false;
            
        
    

    TrieNode root = new TrieNode();
    void insert(String s)
        TrieNode p = root;
        for(int i=0;i<s.length();i++)
            int index = s.charAt(i) - 'a';
            if(p.childs[index]==null) p.childs[index] = new TrieNode();
            p = p.childs[index];
        
        p.s = s;
    

以上是关于212. 单词搜索 II的主要内容,如果未能解决你的问题,请参考以下文章

[JavaScript 刷题] 树 - 单词搜索 II, leetcode 212

212. 单词搜索 II

212. 单词搜索 II

212. 单词搜索 II (Trie&dfs)

LeetCode 162. 寻找峰值(二分)/ 212. 单词搜索 II(Trie字典树) / 36. 有效的数独

212. Word Search II