1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48
| class Solution { public: vector<string> findWords(vector<vector<char>>& board, vector<string>& words) { auto root = new TireNode(); for(auto& word : words) insert(root, word); int nx = board.size(), ny = board[0].size(); for(int i = 0; i < nx; ++i) for(int j = 0; j < ny; ++j) dfs(board, i, j, root, nx, ny); vector<string> ret(set.begin(), set.end()); return ret; } private: unordered_set<string> set; struct TireNode { string word; unordered_map<char, TireNode*> childs; }; void insert(TireNode* root, string& word) { auto node = root; for(auto ch : word) { if(!node->childs.count(ch)) node->childs.emplace(ch, new TireNode()); node = node->childs[ch]; } node->word = word; } void dfs(vector<vector<char>>& board, int i, int j, TireNode* node, int nx, int ny) { if(i < 0 || j < 0 || i >= nx || j >= ny || board[i][j] < 'a') return; if(!node->childs.count(board[i][j])) return; node = node->childs[board[i][j]]; if(!node->word.empty()) set.emplace(node->word); board[i][j] -= 'a'; dfs(board, i + 1, j, node, nx, ny); dfs(board, i - 1, j, node, nx, ny); dfs(board, i, j + 1, node, nx, ny); dfs(board, i, j - 1, node, nx, ny); board[i][j] += 'a'; } };
|