给出一个由小写字母组成的矩阵和一个字典。找出所有同时在字典和矩阵中出现的单词。一个单词可以从矩阵中的任意位置开始,可以向左/右/上/下四个相邻方向移动。
给出矩阵:
doaf agai dcan
和字典:
{"dog", "dad", "dgdg", "can", "again"}
doaf agai dcan
dad:
doaf agai dcan
can:
doaf agai dcan
again:
doaf agai dcan
挑战 使用单词查找树来实现你的算法
class Node { public: char value; Node *children[26]; bool isEnd; Node(char v) : value(v), isEnd(false) { for (int i = 0; i < 26; i++) { children[i] = NULL; } } }; class Solution { public: /** * @param board: A list of lists of character * @param words: A list of string * @return: A list of string */ vector<string> wordSearchII(vector<vector<char> > &board, vector<string> &words) { // write your code here Node *root = new Node('r'); for (int i = 0; i < words.size(); i++) { addToTree(root, words[i]); } set<string> result; int m = board.size(); int n = board[0].size(); vector<vector<bool> > flags(m, vector<bool>(n, false)); for (int i = 0; i < m; i++) { for (int j = 0; j < n; j++) { vector<char> buf; findWord(root, board, m, n, i, j, buf, result, flags); } } vector<string> rst; for (set<string>::iterator it = result.begin(); it != result.end(); it++) { rst.insert(rst.begin(), *it); } return rst; } private: void addToTree(Node *root, string &word) { Node *p = root; for (int i = 0; i < word.length(); i++) { if (p->children[word[i]-'a'] == NULL) { Node *child = new Node(word[i]); p->children[word[i]-'a'] = child; p = child; } else { p = p->children[word[i]-'a']; } } p->isEnd = true; } void findWord(Node *root, vector<vector<char> > &board, int m, int n, int row, int col, vector<char> &buf, set<string> &result, vector<vector<bool> > &flags) { if (row >= m || col >= n || row < 0 || col < 0) { return; } Node *p = root->children[board[row][col]-'a']; if (p == NULL) { return; } if (flags[row][col]) { return; } buf.push_back(board[row][col]); flags[row][col] = true; if (root->children[board[row][col]-'a']->isEnd) { string temp; for (int i = 0; i < buf.size(); i++) { temp += buf[i]; } result.insert(temp); } findWord(p, board, m, n, row, col-1, buf, result, flags); findWord(p, board, m, n, row, col+1, buf, result, flags); findWord(p, board, m, n, row-1, col, buf, result, flags); findWord(p, board, m, n, row+1, col, buf, result, flags); buf.pop_back(); flags[row][col] = false; } };