首页 > 编程知识 正文

coca20000词频表下载,有关能力的单词

时间:2023-05-03 20:56:23 阅读:53934 作者:4821

目录(212 )单词检索范例1例2提示)解题思路

主题: 212 .单词搜索II

难度:困难

题目

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

单词必须按字母顺序由相邻thdnp中的字符组成。 其中,“相邻”thdnp是水平相邻或垂直相邻的thdnp。 同一thdnp中的字符不允许在一个单词中重复使用。

例1

输入: board=[[“o、[a]、[a]、[n]、[e]、[t]、[e]、[I]、[h]、[k]、[r]]

输出: " eat "、" oath " "

例2

输入: board=[[“a”、“b”]、[“c”、“d”]、words=[“abcb”]

输出: []

提示: m==board.lengthn==board [ I ].length1=m, n=12board[i][j]由小写英文字母1=Words.length=3* 1041=words [ I ].length=10 words [ I ]小写英文字母组成words中的所有字符串互不相同

版权归互联网所有。 商业转载请联系官方许可证。 非商业转载请注明出处。

解题思路这个问题的思路是追溯前缀树,存储前缀树单词的信息,追溯到四个方向寻找单词。

前缀树也称为单词数,单词只存储在某个节点上,同时各节点上存储其后缀。

类解决方案{ public : structtrienode { string word; unordered_mapchar,TrieNode* next; 三节点((this-word=' '; }; voidtrie_insert(trienode*root,string word ) { TrieNode* node=root; for(autoch:word ) if (! node-next.count(ch ) ) { node-next[ch]=new TrieNode ); } node=node-next[ch]; }节点word=word; } int dirs [4] [2]={ 1,0 },{-1,0 },{0,1 },{ 0,-1}; bool DFS (三节点*根,vectorvectorchar board,int x,int y,setstring res ) { char ch=board[x][y]; if (! 根下一个. count (ch ) ) { return false; }根=根下一步[ ch ]; if (! root-word.empty () ) RES.insert (root-word ); board[x][y]='# '; for(intI=0; i 4; I ) { int nx=x dirs[i][0]; int ny=y dirs[i][1]; if (NX=0nx board.size (ny=0ny board [0].size ) ) if ) board[NX][ny]!='# ' ) { DFS (根、板、nx、纽约、res ); } } } board[x][y]=ch; 返回真; } vectorstringfindwords (vectorvectorcharboard,vectorstring words ) { TrieNode* root=new TrieNode ); 设置RES; 向量字符串ans; //前缀树for (自动word : words ) trie_insert ) root,word ); //DFSfor(intI=0; i board.size (; I ) for(intj=0; j board[0].size (; j ) ) DFS (根、板、I、j、res ); }//处理输出for(autoword:RES ) ans.push_back ) word ); }返回Ans; };

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