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 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72
| typedef struct TrieNode{ TrieNode* child[26]; bool isendWord;
TrieNode():isendWord(false){ for (int i = 0; i < 26; i ++) child[i] = NULL; } }* trie_node;
class Trie { public: Trie(vector<string>& words){ root = new TrieNode(); for(auto word : words) addWord(word); }
trie_node getRoot(){ return root; }
void addWord(const string& word){ trie_node p = root; for (int i = 0; i < word.size(); i ++) { int j = word[i] - 'a'; if(!p -> child[j]) p -> child[j] = new TrieNode(); p = p -> child[j]; } p -> isendWord = true; }
private: trie_node root; };
class Solution { public: vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
trie_node root = (new Trie(words)) -> getRoot();
set<string> res_set; for (int i = 0; i < board.size(); i++) for(int j = 0; j < board[0].size(); j++) searchWord(board, i, j, root, "", res_set); vector<string> res; for(auto word : res_set) res.push_back(word); return res; }
void searchWord (vector< vector<char> >& board, int i, int j, trie_node root, string word, set<string>& res_set) {
if(i < 0 || j < 0 || i >= board.size() || j >= board[0].size() || board[i][j] == '*') return;
if(root -> child[board[i][j] - 'a']){ word += board[i][j]; root = root -> child[board[i][j] - 'a']; if(root -> isendWord) res_set.insert(word);
char temp = board[i][j]; board[i][j] = '*'; searchWord(board, i - 1, j, root, word, res_set); searchWord(board, i + 1, j, root, word, res_set); searchWord(board, i, j - 1, root, word, res_set); searchWord(board, i, j + 1, root, word, res_set); board[i][j] = temp;
} }
};
|