Java实现 LeetCode 212 单词搜索 II(二)
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(二)相关推荐
- 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 ...
- leetcode: 212. 单词搜索II
212. 单词搜索II 来源:力扣(LeetCode) 链接: https://leetcode.cn/problems/word-search-ii 给定一个 m x n 二维字符网格 board和 ...
- LeetCode 212. 单词搜索 II(Trie树+DFS)
1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...
- leetcode 212. 单词搜索 II 字典树+深度优先搜索 java代码 详细解释
给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格 ...
- 【亡羊补牢】挑战数据结构与算法 第19期 LeetCode 212. 单词搜索 II(字典树,附上JS模板)
仰望星空的人,不应该被嘲笑 题目描述 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成, ...
- leetcode 212:单词搜索II
题目描述: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过 相邻的单元格 内的字母构成,其 ...
- 【每日一题】212. 单词搜索 II
212. 单词搜索 II 题目描述: 给定一个 m x n 二维字符网格 board 和一个单词(字符串)列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过 相邻 ...
- Java实现 LeetCode 79 单词搜索
79. 单词搜索 给定一个二维网格和一个单词,找出该单词是否存在于网格中. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻"单元格是那些水平相邻或垂直相邻的单元格. ...
- leetcode 212. Word Search II | 212. 单词搜索 II(Trie,回溯,DFS)
题目 https://leetcode.com/problems/word-search-ii/ 题解 基于前缀树实现,如果把 Trie 也看做一个特殊的图的话,就是 将两个图同时进行 dfs,就像判 ...
最新文章
- Go 学习笔记(71)— Go 接口 interface (接口定义、接口实现、接口调用、值接收者、指针接收者)
- 少侠请重新来过 - Vue学习笔记(八) - Vuex
- java 基础之 null 与 “”
- 学习java第一步_Spring Boot 学习第一步(搭建初步环境)
- UIImageJPEGRepresentation和UIImagePNGRepresentation
- 校园春色关不住,怎奈何唯有花枝俏,不见赏花人?
- MySQL set names 命令_mysql set names 命令和 mysql 字符编码问题
- AcWing:3.完全背包问题
- jeecmsv9导入mysql详细步骤_jeecms v9.3数据库导入
- eclipse项目中关于导入的项目里提示HttpServletRequest 不能引用的解决办法
- 第5章 MySQL高可用架构设计
- 考研c 语言程序设计题库,温州大学c语言程序设计考研复试核心题库(23页)-原创力文档...
- SQL Server中授予用户查看对象定义的权限
- MySQL 5.7主从复制从零开始设置及全面详解——实现多线程并行同步,解决主从复制延迟问题!...
- python文件查重_使用Python查找目录中的重复文件
- java学习笔记参考
- 存储技术(一)-基本概念和技术发展
- 【python】画折线图
- SQL 数据库简单使用
- 第八周---FPGA流水灯显示和串口循环输出实验
热门文章
- 平移不变性和平移可变性理解
- pytorch房价预测练习
- 武田宣布2020财年第一季度业绩;确认管理层指引,并提高全年列报运营利润和列报净利润
- 查看linux内核的三种方法
- python可以自动录凭证_我用 Python 实现自动刷抖音小姐姐
- oracle分页排序sql,oracle 排序分页 高效sql语句
- 一文搞懂JSON.stringify和JSON.parse(五)JSON.parse使用说明
- 2008.05.14 地震--灾难--捐款
- singleTask 特性
- php课设报告致谢_php毕业设计课题