LeetCode—212 Word Search II
来源:互联网 发布:韩国女子组合知乎 编辑:程序博客网 时间:2024/05/16 09:43
思路:调用word Search 1方法,因为测试的词肯定比较多,所以先做一遍预处理。
public class Solution {Map<Character, Map<Character, Integer>> map=new HashMap<Character, Map<Character,Integer>>();Map<String,Integer> finish=new HashMap<String, Integer>(); public List<String> findWords(char[][] board, String[] words) { List<String> ans=new ArrayList<String>(); init(board); for (int i = 0; i < words.length; i++) { if (finish.get(words[i])==null&&pre(words[i])&&exist(board, words[i])) { ans.add(words[i]);} //验证过的字符串不再次验证 finish.put(words[i], 1);} return ans; } /** * 粗略判断,判断字符串中的每个字符是否出现在表格上以及下一个字符是否在该字符周围可以找到 * @author xuxuan * @date 2015-11-4下午04:23:28 * @param word * @return */ public boolean pre(String word){ char[] c=word.toCharArray(); for (int i = 0; i < c.length-1; i++) {char b=c[i];char e=c[i+1];if (map.get(b)==null||map.get(b).get(e)==null) {return false;}} return true; } /** * 预处理,先把每个字符周围的值写进map * @param board */ public void init(char[][] board){ int iL=board.length; int jL=board[0].length; for (int i = 0; i < iL; i++) {for (int j = 0; j < jL; j++) {Map<Character, Integer> m=map.get(board[i][j]);if (m==null) {m=new HashMap<Character, Integer>();}if (i-1>=0) {m.put(board[i-1][j], 1);}if (i+1<iL) {m.put(board[i+1][j], 1);}if (j-1>=0) {m.put(board[i][j-1], 1);}if (j+1<jL) {m.put(board[i][j+1], 1);}map.put(board[i][j], m);}} } public boolean exist(char[][] board, String word) { if (word==null||word.length()==0||board==null||board.length==0) { return false; } char[] ch=word.toCharArray(); int length=ch.length; int m=board.length; int n=board[0].length; boolean[][] flag=new boolean[m][n]; for (int i = 0; i < board.length; i++) { for (int j = 0; j < board[i].length; j++) { if (board[i][j]==ch[0]&&f(board,ch,0,i,j,length,m,n,flag)) { return true; } } } return false; } /** * 各参数含义 * @param board参照表格 * @param ch测试的字符串转成字符数组 * @param level测试数组的下标 * @param x探测表格的横坐标 * @param y探测表格的纵坐标 * @param length数组的长度 * @param m表格的横长 * @param n表格的纵长 * @param flag标记表格该位置的字符是否被使用过,true表示使用过,false表示未使用过 * @return */ public boolean f(char[][] board,char[] ch,int level,int x,int y,int length,int m,int n,boolean[][] flag){ if (level==length) { return true; } if (x<0||x>=m||y<0||y>=n||flag[x][y]||board[x][y]!=ch[level]) { return false; } flag[x][y]=true; if (f(board,ch,level+1,x+1,y,length,m,n,flag)) { return true; } if (f(board,ch,level+1,x-1,y,length,m,n,flag)) { return true; } if (f(board,ch,level+1,x,y+1,length,m,n,flag)) { return true; } if (f(board,ch,level+1,x,y-1,length,m,n,flag)) { return true; } flag[x][y]=false; return false; } }
0 0
- LeetCode—212 Word Search II
- leetcode 212: Word Search II
- Leetcode #212 Word Search II
- leetcode 212: Word Search II
- 212 Word Search II [Leetcode]
- Leetcode (212) Word Search II
- leetcode(212). Word Search II
- LeetCode Word Search II
- [leetcode] Word Search II
- LeetCode Word Search II
- leetcode Word Search II
- LeetCode - Word Search II
- [leetcode]Word Search II
- leetcode Word Search II
- Leetcode -- Word Search II
- LeetCode Word Search II
- Leetcode @ Word Search II
- 【Leetcode】Word Search II
- Android内存泄露的原因
- 最简单的mfs环境
- 【记录】绵东实三校联考 验题记录
- 功能担当!超实用的网站页脚设计小技巧
- 双缓冲程序
- LeetCode—212 Word Search II
- Ibatis 动态条件SQL语句
- 代码风格
- 各种排序总结(一)之--—冒泡排序、选择排序、快速排序
- 【学习之道】 Android学习资源整理
- iOS小技巧-MJRefresh简单整合
- 推荐6款常用的Java开源报表制作工具
- 使用 javamail 做邮箱验证功能
- IBAction和IBOutlet