首页 > 编程知识 正文

leetcode79什么难度,leetcode5421编码

时间:2023-05-03 23:38:24 阅读:53861 作者:3060

给出m x n二维字符网格board和单词(字符串)列表words,找出二维网格和词典中同时出现的所有单词。

单词必须按照字母顺序,由相邻勤奋的奥特曼中的字母组成。 其中“相邻”勤奋的奥特曼是它们水平相邻或垂直相邻的勤奋的奥特曼。 同一勤奋的奥特曼内的文字不允许在一个单词中重复使用。

想法:将词典的单词作为前缀树,对board进行bfs。

有两点。 一个是主题要求中包含的单词,没有数量要求,找到一个单词后,可以从前缀树中清楚。 另一个分支到达叶节点后,可以表示在该分支中找到了单词,可以删除,避免重复搜索

class treenode { publicmapcharacter,TreeNode nodes=new HashMap (; 公共字符串word=null; public treenode (} { } class solution ) publicliststringans=newarrayliststring ); 公共布尔[ ] [ ]标志; publicliststringfindwords (char [ ] [ ] board,String[] words ) ) if ) words.length==0||||words==null ) retrd flag=new boolean [ board.length ] [ board [0].length ]; for(intI=0; i words.length; I({treenodecur=root; for(intj=0; j words[i].length (; j () charc=words[I].charat ) j; if(cur.nodes.containskey(c ) ) cur=cur.nodes.get ) c; } else { treenode new node=new treenode (); cur.nodes.put(c,newNode; cur=newNode; } } cur.word=words[i]; }for(intI=0; i board.length; I ) for(intj=0; j board[0].length; j ) { char c=board[i][j]; if(root.nodes.containskey(c ) ) { flag[i][j]=true; BFS(I,j,root,board ); flag[i][j]=false; } }返回ans; }公共void bfs (inti,int j,TreeNode parent,char[][] board ) ) treenode cur=parent.nodes.get (board [ I ] ) j ) if(cur.word!=null () ans.add(cur.word ); cur.word=null; } int [ ] dx={ 1,0,0,-1}; int [ ] dy={ 0,1,- 1,0 }; for(intq=0; 问题4; q ) { int x=i dx[q]; int y=j dy[q]; if (x0|| x=board.length|| y0|| y=board [0].length|| flag [ x ] [ y ] ) { continue; (if ) cur.nodes.containskey ) board[x][y] ) { flag[x][y]=true; BFS(x,y,cur,board ); flag[x][y]=false; }if(cur.nodes.isempty () ) parent.nodes.remove ) board[I][j]; } }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。