212. 单词搜索 II
Posted 潜行前行
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了212. 单词搜索 II相关的知识,希望对你有一定的参考价值。
- 单词搜索 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