给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词。

单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相邻的单元格。同一个单元格内的字母在一个单词中不允许被重复使用。

  1. 输入:
  2. words = ["oath","pea","eat","rain"] and board =
  3. [
  4. ['o','a','a','n'],
  5. ['e','t','a','e'],
  6. ['i','h','k','r'],
  7. ['i','f','l','v']
  8. ]
  9. 输出: ["eat","oath"]

Trie

  1. class Trie {
  2. struct TrieNode {
  3. bool end;
  4. string str;
  5. unordered_map<char, TrieNode *> child;
  6. TrieNode(): end(false), str("") {};
  7. };
  8. public:
  9. Trie() {
  10. root = new TrieNode();
  11. }
  12. void insert(string word) {
  13. TrieNode *cur = root;
  14. for (int i = 0; i < word.size(); i++) {
  15. if (cur->child.count(word[i]) == 0) {
  16. cur->child[word[i]] = new TrieNode();
  17. }
  18. cur = cur->child[word[i]];
  19. }
  20. cur->str = word; //下一个节点存单词, 当前节点不存。
  21. cur->end = true;
  22. }
  23. void search(vector<string>& res, vector<vector<char>>& board) {
  24. for (int i = 0; i < board.size(); i++) {
  25. for (int j = 0; j < board[i].size(); j++) {
  26. help(res, board, root, i, j);
  27. }
  28. }
  29. }
  30. void help(vector<string>& res, vector<vector<char>>& board, TrieNode *p, int x, int y) {
  31. if (p->end) { //因为trie树把单词存入下一个节点,所以这里进来就判断是不是单词结尾,走到该处,说明有一个完整的单词
  32. res.push_back(p->str);
  33. p->end = false; //防止重复添加
  34. return;
  35. }
  36. if (x < 0 || x == board.size() || y < 0 || y == board[x].size()) return; //判断边界
  37. if (p->child.find(board[x][y]) == p->child.end()) return; //当前节点的map中找不到board中四通图的字符则返回
  38. //下面是找到了字符
  39. p = p->child[board[x][y]]; //找下一个节点,下一个节点end为true的话,说明找到了完整的单词
  40. char cur = board[x][y];
  41. board[x][y] = '#';
  42. help(res, board, p, x + 1, y); //不能先算减一
  43. help(res, board, p, x - 1, y);
  44. help(res, board, p, x, y + 1); //同上
  45. help(res, board, p, x, y - 1);
  46. board[x][y] = cur;
  47. }
  48. private:
  49. TrieNode *root;
  50. };
  51. class Solution {
  52. public:
  53. vector<string> findWords(vector<vector<char>>& board, vector<string>& words) {
  54. Trie trie;
  55. for (string &w : words) {
  56. trie.insert(w);
  57. }
  58. vector<string> res;
  59. trie.search(res, board);
  60. return res;
  61. }
  62. };