当前位置: 首页 > backend >正文

212. 单词搜索 II

https://leetcode.cn/problems/word-search-ii/description/?envType=study-plan-v2&envId=top-interview-150

思路:
1. 我们可以先将这个单词网格转化成一颗字典树,然后再拿words进行搜索。
2. 我们可以先将words装换成字典树,然后在在board中选点看能不能走出一条满足的路径来
对于这两个思路其实差不多,但是1的话如果board太大就很容易超时,而且无用的构建会很多(比如有一个5*5的board,理论一条路径长度应该是25,但是如果words中长的单词都只有5的话我们就根本用不到这么长)。
所以权衡来看第二种思路会更好

思路一(确实会超时):

class Trie {Trie[] children;boolean isEnd;public Trie() {children = new Trie[26];isEnd = true; // 每个被构造出的节点都是一个单词的结尾}}public List<String> findWords(char[][] board, String[] words) {boolean[][] signed = new boolean[board.length][board[0].length];Trie root = new Trie();for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {signed[i][j] = true;if(root.children[board[i][j] - 'a'] == null) {root.children[board[i][j] - 'a'] = new Trie();}transfer(board, signed, root.children[board[i][j] - 'a'], i, j);signed[i][j] = false;}}List<String> ans = new ArrayList<>();for(String word : words) {if(search(root, word)) {ans.add(word);}}return ans;}public void transfer(char[][] board, boolean[][] signed, Trie root, int x, int y) {for(int i = 0; i < 4; i++) {int xx = x + dx[i];int yy = y + dy[i];if(xx >= 0 && xx < board.length && yy >= 0 && yy < board[0].length && !signed[xx][yy]) {signed[xx][yy] = true;if(root.children[board[xx][yy] - 'a'] == null) root.children[board[xx][yy] - 'a'] = new Trie();transfer(board, signed, root.children[board[xx][yy] - 'a'], xx, yy);signed[xx][yy] = false;}}}

 思路二:

    class Trie {Trie[] children;String word; // 如果当前节点是不是一个单词的结尾,那么word=这个单词,否则word=""public Trie() {children = new Trie[26];word = "";}}public List<String> findWords(char[][] board, String[] words) {// 将words构建成字典树Trie root = new Trie();for(String word : words) {add(root, word);}boolean[][] signed = new boolean[board.length][board[0].length];HashSet<String> ans = new HashSet<>();// 在board中选取点在Tire中走看是否存在路径for(int i = 0; i < board.length; i++) {for(int j = 0; j < board[0].length; j++) {signed[i][j] = true;dfs(root, board, signed, ans, i, j);signed[i][j] = false;}}return new ArrayList<>(ans);}public void add(Trie root, String word) {for(int i = 0; i < word.length(); i++) {if(root.children[word.charAt(i) - 'a'] == null) {root.children[word.charAt(i) - 'a'] = new Trie();}root = root.children[word.charAt(i) - 'a'];}root.word = word;}/*** 深度优先搜索* @param root 当前节点* @param board 单词网格* @param signed 标记数组* @param ans 答案* @param x 当前位置x坐标* @param y 当前位置y坐标*/public void dfs(Trie root, char[][] board, boolean[][] signed, HashSet<String> ans, int x, int y) {if(root == null) return;if(!Objects.equals(root.word, "")) {ans.add(root.word);}root = root.children[board[x][y] - 'a'];for(int i = 0; i < 4; i++) {int xx = x + dx[i];int yy = y + dy[i];if(xx >= 0 && xx < board.length && yy >= 0 && yy < board[0].length && !signed[xx][yy]) {char ch = board[xx][yy];signed[xx][yy] = true;dfs(root, board, signed, ans, xx, yy);signed[xx][yy] = false;}}if (root != null && root.word != "") ans.add(root.word);}public boolean search(Trie root, String word) {for(int i = 0; i < word.length(); i++) {if(root.children[word.charAt(i) - 'a'] == null) {return false;}root = root.children[word.charAt(i) - 'a'];}return "".equals(root.word);}

http://www.xdnf.cn/news/8381.html

相关文章:

  • Pytorch里面多任务Loss是加起来还是分别backward? | Pytorch | 深度学习
  • 数据结构——树
  • 快捷回复预设文本工具
  • Python字符串及正则表达式
  • 【PhysUnits】9 取负重载(negation.rs)
  • el-input宽度自适应方法总结
  • Matlab入门
  • 个人理解 火山引擎的实时对话 AI 如何利用 WebRTC、大模型、语音识别(ASR)、语音合成(TTS)等技术实现低延迟的实时对话功能。
  • PostgreSQL 数据库备份与恢复
  • 学习黑客 tcpdump
  • 服务器为什么会产生垃圾文件
  • 【JS】Vue 3中ref与reactive的核心区别及使用场景
  • 【JVM 02-JVM内存结构之-程序计数器】
  • 提升推理能力会丢失指令跟随的能力?——【论文阅读笔记】
  • 从逻辑学视角严谨证明数据加密的数学方法与实践
  • 多级Cache
  • 城市地下“隐形卫士”:激光甲烷传感器如何保障燃气安全?
  • 使用 kafka-console-consumer.sh 指定时间或偏移量消费
  • 【golang】能否在遍历map的同时删除元素
  • HTTP协议接口三种测试方法之-postman
  • LinkedList 与 ArrayList 的区别及使用场景
  • 想免费使用 AWS 云服务器?注册、验证及开通全攻略
  • NV054NV057美光固态闪存NV059NV062
  • 穿屏技巧:Mac-Windows一套鼠标键盘控制多台设备 (sharemouse6.0-Keygen)| KM-401A
  • 2025 全球优质 AI 产品深度测评:从通用工具到垂直领域的技术突围 —— 轻量聚合工具篇
  • Sentinel+OpenFeign实现服务熔断与降级:构建弹性微服务架构的核心实践
  • 响应面法(Response Surface Methodology ,RSM)
  • Go语言中内存释放 ≠ 资源释放
  • 【JVM 03-JVM内存结构之-虚拟机栈】
  • 二极管的伏安特性与主要参数