public class Find2 {
public int[] dx={1,-1,0,0};
public int[] dy={0,0,1,-1};
class Trie{
Trie[] tries;
String isEnd;
public Trie(){
tries = new Trie[26];
}
}
public boolean[][] vis; //是否判断过
public List<String> res; //答案 public void insert(String word, Trie root){
Trie t = root;
for(int i = 0;i < word.length();i++){
int index = word.charAt(i)-'a';
if(t.tries[index] == null){
t.tries[index] = new Trie();
}
t = t.tries[index];//跳到子节点
}
t.isEnd = word;
} public List<String> findWords(char[][] board, String[] words) {
//先把单词存入字典树当中
Trie root=new Trie();
for(String word:words){
insert(word,root);
} res=new ArrayList<String>();
vis=new boolean[board.length][board[0].length];
for(int i=0;i<board.length;++i){ //对board每一个点都进行检索
for(int j=0;j<board[i].length;++j){
dfs(root,i,j,board);
}
}
Collections.sort(res); //需要对结果进行排序
return new ArrayList<String>(res);
} public void dfs(Trie cur,int x,int y,char[][] board){
//判断边界
if(x<0||y<0||x>=board.length||y>=board[0].length||vis[x][y]){
return;
}
cur=cur.tries[board[x][y]-'a']; //延伸下一个节点
vis[x][y]=true; //把当前设置为走过 不可重复走
if(cur!=null){ //如果当前不为null的话 可以继续检索
if(cur.tries!=null){ //说明到这里已经可以组成一个单词了
res.add(cur.isEnd);
cur.tries=null; //变成null是为了防止重复加入单词
}
for(int i=0;i<4;++i){
dfs(cur,x+dx[i],y+dy[i],board); //四个方向检索
}
}
vis[x][y]=false;
} public static void main(String[] args) { String[] words ={"oath","pea","eat","rain"};
char[][] board = {
{'o', 'a', 'a', 'n'},
{'e', 't', 'a', 'e'},
{'i', 'h', 'k', 'r'},
{'i', 'f', 'l', 'v'}
};
Solution m = new Solution();
List<String> a = m.findWords(board,words);
System.out.println(a.toString());
}
}

最新文章

  1. 利用JS实现点击按钮后图片自动切换
  2. Apache Marmotta 3.1.0-incubating 发布
  3. linux实践——ELF分析
  4. 半透明背景(兼容IE)
  5. linux 参数优化
  6. android 文件的权限
  7. APNs-远程推送
  8. discuz论坛目录功能详解
  9. dubbo 服务化
  10. ubuntu下一个jboss-seam-2.2.2.Final/examples/build.xml:754: warning: &amp;#39;includeantruntime&amp;#39; was not set
  11. 前端入门20-JavaScript进阶之异步回调的执行时机
  12. vue(4)—— vue的过滤器,监听属性,生命周期函数,获取DOM元素
  13. CSCI 1100 — Computer Science 1 Homework
  14. 关于javaweb项目红叉报错可但项目可以正常运行的解决办法
  15. 配置java-jdk
  16. SQL注入理解与防御
  17. Hadoop 命令 &amp;&amp; Web UI
  18. 解决tableView中cell动态加载控件的重用问题
  19. 洛谷 P4279 [SHOI2008]小约翰的游戏 解题报告
  20. Pytho并发编程-利用协程实现简单爬虫

热门文章

  1. [hihoCoder1236 Scores 2015BeijingOnline]简单粗暴的分块+简单粗暴的bitset
  2. 内容安全策略(CSP)详解
  3. An SWT error has occurred
  4. linux --自已的域名无法登陆机器的解决办法:同步时间
  5. sqli-labs之Page-3
  6. jbpm4 candidate理解
  7. 2018-06-25 js表单事件、三个高度和Ajax异步通讯技术
  8. 黑马程序员_毕向东_Java基础视频教程——三元运算符(随笔)
  9. 「雕爷学编程」Arduino动手做(22)——8X8 LED点阵MAX7219屏
  10. Java线程的几种可用状态