LeetCode 79 的推廣版
從尋找一個字串升級到尋找多個字串
建一個Trie
只沿著prefix做dfs
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 73 74 75 | class Trie { public: static constexpr int NODESIZE = 26; bool isWord; string word; Trie* child[NODESIZE]; Trie() { isWord = false; for (int i = 0; i < NODESIZE; i++) this->child[i] = nullptr; } void insert(string s) { Trie *node = this; for (auto &chr : s) { int idx = chr - 'a'; if (!node->child[idx]) node->child[idx] = new Trie(); node = node->child[idx]; } node->isWord = true; node->word = s; } }; class Solution { private: int dx[4] = {1, -1, 0, 0}; int dy[4] = {0, 0, 1, -1}; static constexpr int SIZE = 20; bool vis[SIZE][SIZE] = {0}; int M, N; vector<string> ans; void dfs(int x, int y, Trie* trie, vector<vector<char>>& board) { if (trie->isWord) { ans.push_back(trie->word); trie->isWord = false; } for (int i = 0; i < 4; i++) { if (x + dx[i] >= 0 && x + dx[i] < M && y + dy[i] >= 0 && y + dy[i] < N && !vis[x + dx[i]][y + dy[i]]) { vis[x + dx[i]][y + dy[i]] = true; int idx = board[x + dx[i]][y + dy[i]] - 'a'; if (trie->child[idx]) dfs(x + dx[i], y + dy[i], trie->child[idx], board); vis[x + dx[i]][y + dy[i]] = false; } } } public: vector<string> findWords(vector<vector<char>>& board, vector<string>& words) { Trie* root = new Trie(); for (string word : words) root->insert(word); M = board.size(); N = board[0].size(); for (int i = 0; i < M; i++) { for (int j = 0; j < N; j++) { vis[i][j] = true; int idx = board[i][j] - 'a'; if (root->child[idx]) dfs(i, j, root->child[idx], board); vis[i][j] = false; } } return ans; } }; |