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"]
说明:
你可以假设所有输入都由小写字母 a-z 组成。

提示:

你需要优化回溯算法以通过更大数据量的测试。你能否早点停止回溯?
如果当前单词不存在于所有单词的前缀中,则可以立即停止回溯。什么样的数据结构可以有效地执行这样的操作?散列表是否可行?为什么? 前缀树如何?如果你想学习如何实现一个基本的前缀树,请先查看这个问题: 实现Trie(前缀树)。

PS:
首先构建一个字典树,然后在dfs的时候加入字典树,以某个字符串结尾的可以减少搜索次数
这里为什么不用开头用结尾呢, (●ˇ∀ˇ●)
结尾在这里就是我搜索完一个,我可以直接比较,如果没有的话,我再返回上一个,

class TrieNode {private static final int ALPHABET_SIZE = 26;TrieNode[] children = new TrieNode[ALPHABET_SIZE];// 判断这个前缀是不是某个字符串的结尾boolean isEndOfWord = false;TrieNode() {isEndOfWord = false;for (int i = 0; i < ALPHABET_SIZE; i++)children[i] = null;}
}class Trie {public TrieNode root;/** Initialize your data structure here. */public Trie() {root = new TrieNode();}/** Inserts a word into the trie. */public void insert(String word) {TrieNode curNode = root;int index;for (int i = 0; i < word.length(); i++) {index = word.charAt(i) - 'a';if (curNode.children[index] == null) {curNode.children[index] = new TrieNode();}curNode = curNode.children[index];}curNode.isEndOfWord = true;}
}
class Solution {public List<String> findWords(char[][] board, String[] words) {List<String> result = new ArrayList<>();if (words == null || words.length == 0 || board == null || board.length == 0 || board[0].length == 0)return result;Trie trie = new Trie();for (String temp : words)trie.insert(temp);TrieNode root = trie.root;boolean[][] visited = new boolean[board.length][board[0].length];Set<String> tempResult = new HashSet<>();StringBuilder sb = new StringBuilder();for (int i = 0; i < board.length; i++) {for (int j = 0; j < board[0].length; j++) {if (root.children[board[i][j] - 'a'] != null ) {dfs(board, visited, i, j, root.children[board[i][j] - 'a'], tempResult, sb);}}}// 需要把tempResult这个set拷贝到真正的result List中进行返回Iterator<String> iterator = tempResult.iterator();while (iterator.hasNext()) {result.add(iterator.next());}return result;}private void dfs(char[][] board, boolean[][] visited, int startIInBoard, int startJInBoard, TrieNode curNode, Set<String> resultSet, StringBuilder curStrBuilder) {curStrBuilder.append(board[startIInBoard][startJInBoard]);visited[startIInBoard][startJInBoard] = true;if (curNode.isEndOfWord) {resultSet.add(curStrBuilder.toString());}// 向上搜索, 如果上面的格子没有被搜索过的话if (startIInBoard > 0 && !visited[startIInBoard - 1][startJInBoard]&& curNode.children[board[startIInBoard - 1][startJInBoard] - 'a'] != null) {dfs(board, visited,startIInBoard - 1, startJInBoard, curNode.children[board[startIInBoard - 1][startJInBoard] - 'a'], resultSet, curStrBuilder);}// 向下搜索if (startIInBoard < board.length - 1 && !visited[startIInBoard + 1][startJInBoard]&& curNode.children[board[startIInBoard + 1][startJInBoard] - 'a'] != null) {dfs(board, visited,startIInBoard + 1, startJInBoard, curNode.children[board[startIInBoard + 1][startJInBoard] - 'a'], resultSet, curStrBuilder);}// 向左搜索if (startJInBoard > 0 && !visited[startIInBoard][startJInBoard - 1]&& curNode.children[board[startIInBoard][startJInBoard - 1] - 'a'] != null) {dfs(board, visited, startIInBoard, startJInBoard - 1, curNode.children[board[startIInBoard][startJInBoard - 1] - 'a'], resultSet, curStrBuilder);}// 向右搜索if (startJInBoard < board[0].length - 1 && !visited[startIInBoard][startJInBoard + 1]&& curNode.children[board[startIInBoard][startJInBoard + 1] - 'a'] != null) {dfs(board, visited, startIInBoard, startJInBoard + 1, curNode.children[board[startIInBoard][startJInBoard + 1] - 'a'], resultSet, curStrBuilder);}// 恢复现场curStrBuilder.setLength(curStrBuilder.length() - 1);visited[startIInBoard][startJInBoard] = false;}
}

Java实现 LeetCode 212 单词搜索 II(二)相关推荐

  1. Java实现 LeetCode 212 单词搜索 II

    public class Find2 {public int[] dx={1,-1,0,0};public int[] dy={0,0,1,-1};class Trie{Trie[] tries;St ...

  2. leetcode: 212. 单词搜索II

    212. 单词搜索II 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/word-search-ii 给定一个 m x n 二维字符网格 board和 ...

  3. LeetCode 212. 单词搜索 II(Trie树+DFS)

    1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...

  4. leetcode 212. 单词搜索 II 字典树+深度优先搜索 java代码 详细解释

    给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格 ...

  5. 【亡羊补牢】挑战数据结构与算法 第19期 LeetCode 212. 单词搜索 II(字典树,附上JS模板)

    仰望星空的人,不应该被嘲笑 题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成, ...

  6. leetcode 212:单词搜索II

    题目描述: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其 ...

  7. 【每日一题】212. 单词搜索 II

    212. 单词搜索 II 题目描述: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过 相邻 ...

  8. Java实现 LeetCode 79 单词搜索

    79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...

  9. leetcode 212. Word Search II | 212. 单词搜索 II(Trie,回溯,DFS)

    题目 https://leetcode.com/problems/word-search-ii/ 题解 基于前缀树实现,如果把 Trie 也看做一个特殊的图的话,就是 将两个图同时进行 dfs,就像判 ...

最新文章

  1. Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
  2. 少侠请重新来过 - Vue学习笔记(八) - Vuex
  3. java 基础之 null 与 “”
  4. 学习java第一步_Spring Boot 学习第一步(搭建初步环境)
  5. UIImageJPEGRepresentation和UIImagePNGRepresentation
  6. 校园春色关不住,怎奈何唯有花枝俏,不见赏花人?
  7. MySQL set names 命令_mysql set names 命令和 mysql 字符编码问题
  8. AcWing:3.完全背包问题
  9. jeecmsv9导入mysql详细步骤_jeecms v9.3数据库导入
  10. eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
  11. 第5章 MySQL高可用架构设计
  12. 考研c 语言程序设计题库,温州大学c语言程序设计考研复试核心题库(23页)-原创力文档...
  13. SQL Server中授予用户查看对象定义的权限
  14. MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!...
  15. python文件查重_使用Python查找目录中的重复文件
  16. java学习笔记参考
  17. 存储技术(一)-基本概念和技术发展
  18. 【python】画折线图
  19. SQL 数据库简单使用
  20. 第八周---FPGA流水灯显示和串口循环输出实验

热门文章

  1. 平移不变性和平移可变性理解
  2. pytorch房价预测练习
  3. 武田宣布2020财年第一季度业绩;确认管理层指引,并提高全年列报运营利润和列报净利润
  4. 查看linux内核的三种方法
  5. python可以自动录凭证_我用 Python 实现自动刷抖音小姐姐
  6. oracle分页排序sql,oracle 排序分页 高效sql语句
  7. 一文搞懂JSON.stringify和JSON.parse(五)JSON.parse使用说明
  8. 2008.05.14 地震--灾难--捐款
  9. singleTask 特性
  10. php课设报告致谢_php毕业设计课题