目录(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; };