博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
212. Word Search II
阅读量:4649 次
发布时间:2019-06-09

本文共 3354 字,大约阅读时间需要 11 分钟。

/*     *212. Word Search II      *2016-6-11 by Mingyang     *这真的是我见过最好玩的题目了,在已经有了Trie的基础上,我们再继续往下看     *直接利用这个工具,每次都传进去,这样后面就可以不断的使用这个工具     *然后首先的思路就是把Trie填满需要的东西     *然后就是对每一个位置进行dfs。记住要使用visit map来进行定位     */    public List
findWords(char[][] board, String[] words) { HashSet
list = new HashSet(); Tries trie = new Tries(); for (String word : words) trie.insert(word); boolean[][] visited = new boolean[board.length][board[0].length]; for (int i = 0; i < board.length; i++) for (int j = 0; j < board[0].length; j++) dfss(list, board, visited, "", i, j, trie); return new ArrayList(list); } public void dfss(Set
list, char[][] board, boolean[][] visited, String str, int x, int y, Tries trie) { if (x < 0 || x >= board.length || y < 0 || y >= board[0].length) return; if (visited[x][y]) return; str += board[x][y]; if (!trie.startsWith(str)) return; if (trie.search(str)) list.add(str); visited[x][y] = true; dfss(list, board, visited, str, x - 1, y, trie); dfss(list, board, visited, str, x + 1, y, trie); dfss(list, board, visited, str, x, y - 1, trie); dfss(list, board, visited, str, x, y + 1, trie); visited[x][y] = false; }}class Tries { public TrieNode root; public Tries() { root = new TrieNode(); root.isEnd = true; } public void insert(String word) { if (word == null || word.length() == 0) return; TrieNode node = root; char[] letters = word.toCharArray(); for (int i = 0; i < word.length(); i++) { int pos = letters[i] - 'a'; if (node.son[pos] == null) { node.son[pos] = new TrieNode(); node.son[pos].val = letters[i]; } node = node.son[pos]; } node.isEnd = true; } // Returns if the word is in the trie. public boolean search(String word) { if (word == null || word.length() == 0) { return false; } TrieNode node = root; char[] letters = word.toCharArray(); for (int i = 0; i < word.length(); i++) { int pos = letters[i] - 'a'; if (node.son[pos] != null) { node = node.son[pos]; } else { return false; } } return node.isEnd; } // Returns if there is any word in the trie // that starts with the given prefix. public boolean startsWith(String prefix) { if (prefix == null || prefix.length() == 0) { return false; } TrieNode node = root; char[] letters = prefix.toCharArray(); for (int i = 0; i < prefix.length(); i++) { int pos = letters[i] - 'a'; if (node.son[pos] != null) { node = node.son[pos]; } else { return false; } } return true; }}class TrieNode { // Initialize your data structure here. TrieNode[] son;// 所有的儿子节点 boolean isEnd;// 是不是最后一个节点 char val;// 节点的值 TrieNode() { this.son = new TrieNode[26]; this.isEnd = false; }}

 

转载于:https://www.cnblogs.com/zmyvszk/p/5576344.html

你可能感兴趣的文章
windows 下安装elasticsearch
查看>>
C语言学习12:带参数的main函数,无指定的函数形参,调用库函数处理无指定的函数形参,...
查看>>
禁止某程序联网
查看>>
[LOJ6191][CodeM]配对游戏(概率期望DP)
查看>>
mysql中utf8和utf8mb4区别
查看>>
谈谈源码管理那点事儿(一)——源码管理十诫(转)
查看>>
拒绝switch,程序加速之函数指针数组
查看>>
[你必须知道的.NET]第二十五回:认识元数据和IL(中)
查看>>
.NET中的三种Timer的区别和用法
查看>>
python第三方包安装方法(两种方法)
查看>>
MySQL 索引知识整理(创建高性能的索引)
查看>>
C++ 头文件
查看>>
ZOJ 1008 Gnome Tetravex(DFS)
查看>>
Mysql基础知识:操作数据库
查看>>
mysql 数据库远程访问设置方法
查看>>
Far manager界面混乱问题解决
查看>>
java读取xml文件
查看>>
Go数组和切片定义和初始化
查看>>
用javascript将数据导入Excel
查看>>
novoton-timer使用
查看>>