Word Search II
2015-10-02 17:14
288 查看
题目:
Given a 2D board and a list of words from the dictionary, find all words in the board.
Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.
For example,
Given words =
Return
Note:
You may assume that all inputs are consist of lowercase letters
分析:
借助字典树
参考代码:
http://www.programcreek.com/2014/06/leetcode-word-search-ii-java/
Given a 2D board and a list of words from the dictionary, find all words in the board.
Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.
For example,
Given words =
["oath","pea","eat","rain"]and board =
[ ['o','a','a','n'], ['e','t','a','e'], ['i','h','k','r'], ['i','f','l','v'] ]
Return
["eat","oath"].
Note:
You may assume that all inputs are consist of lowercase letters
a-z.
分析:
借助字典树
参考代码:
http://www.programcreek.com/2014/06/leetcode-word-search-ii-java/
public class Solution { Set<String> result = new HashSet<String>(); public List<String> findWords(char[][] board, String[] words) { //HashSet<String> result = new HashSet<String>(); Trie trie = new Trie(); for(String word: words){ trie.insert(word); } int m=board.length; int n=board[0].length; boolean[][] visited = new boolean[m] ; for(int i=0; i<m; i++){ for(int j=0; j<n; j++){ dfs(board, visited, "", i, j, trie); } } return new ArrayList<String>(result); } public void dfs(char[][] board, boolean[][] visited, String str, int i, int j, Trie trie){ int m=board.length; int n=board[0].length; if(i<0 || j<0||i>=m||j>=n){ return; } if(visited[i][j]) return; str = str + board[i][j]; if(!trie.startsWith(str)) return; if(trie.search(str)){ result.add(str); } visited[i][j]=true; dfs(board, visited, str, i-1, j, trie); dfs(board, visited, str, i+1, j, trie); dfs(board, visited, str, i, j-1, trie); dfs(board, visited, str, i, j+1, trie); visited[i][j]=false; } } //Trie Node class TrieNode{ public TrieNode[] children = new TrieNode[26]; public String item = ""; } //Trie class Trie{ public TrieNode root = new TrieNode(); public void insert(String word){ TrieNode node = root; for(char c: word.toCharArray()){ if(node.children[c-'a']==null){ node.children[c-'a']= new TrieNode(); } node = node.children[c-'a']; } node.item = word; } public boolean search(String word){ TrieNode node = root; for(char c: word.toCharArray()){ if(node.children[c-'a']==null) return false; node = node.children[c-'a']; } if(node.item.equals(word)){ return true; }else{ return false; } } public boolean startsWith(String prefix){ TrieNode node = root; for(char c: prefix.toCharArray()){ if(node.children[c-'a']==null) return false; node = node.children[c-'a']; } return true; } }
相关文章推荐
- bash组织成树数据结构
- java学习笔记----枚举测试题
- JAVA设计模式之单件模式
- 2015 四川省赛 B Carries (脑洞题)
- Java HTTP协议问题集锦
- O(V*n)的多重背包问题
- Effective c++读书笔记三
- [面试时]我是如何讲清楚GCD的
- 使用dbms_file_transfer传输ASM file出现ORA-15001
- silverlight画图 虚线 反射效果 射线渐变效果Radial Gradient
- STC12C5A60S2外部中断P3^2,P3^3 的应用 【中断函数略讲interrupt using】
- Unity3d 3d角色换装实现原理及步骤
- 组织的信息能力与竞争优势
- java15:面向对象
- 【因子算法】——求一个数的因子、质因子、求两个数的公因子
- java中的io机制
- GCC内嵌汇编
- scu 4444 travel
- Java堆和栈的区别 经典总结(转载)
- Xcode 和 Mac 的一些快捷键