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

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);}

相关文章:

  • 机器人收硬币算法c++,完整代码可运行
  • TDengine 高可用——双副本
  • Android Raspberry 请求 api 失败 iOS 请求成功【ssl 证书配置问题】
  • 【LangChain大模型应用与多智能体开发 ① 初识LangChain 】
  • 人工智能100问☞第30问:什么是损失函数?
  • 20250523-BUG:无法加载“GameLib/Framework.h“头文件(已解决)
  • 【Kafka】编写消费者开发模式时遇到‘未解析的引用‘SIGUSR1’’
  • 20250523-BUG-E1696:无法打开元数据文件“platform.winmd(已解决)
  • UI 设计|提高审美|Linear UI风格分享
  • 钉钉出口IP有哪些
  • ECharts图表工厂,完整代码+思路逻辑
  • 【GAN网络入门系列】二,DCGAN人脸图片生成与转置卷积讲解
  • Redis7 新增数据结构深度解析:ListPack 的革新与优化
  • 软件测试(4) 白盒测试
  • 1536. 【中山市第十一届信息学邀请赛决赛】同质(same)
  • 63. 不同路径 II
  • siparmyknife:SIP协议渗透测试的瑞士军刀!全参数详细教程!Kali Linux教程!
  • 运维打铁:生产服务器用户权限管理方案全解析
  • 前端地图数据格式标准及应用
  • vue项目表格甘特图开发
  • 外贸销售网站有哪些/济南seo排名搜索
  • 网页设计介绍说明/北海百度seo
  • 邢台网站建设多少钱/seo经典案例
  • 网站推广 html关键词代码解说/网络销售都是诈骗公司吗
  • 哪个网站做任务赚钱的/seo网站搜索优化
  • 企业网站策划书ppt/如何申请一个网站域名