Leetcode 212. Word Search II
来源:互联网 发布:正版用友软件价格 编辑:程序博客网 时间:2024/04/28 17:53
Given a 2D board and a list of words from the dictionary, find all words in the board.
Each word must be constructed from letters of sequentially adjacent cell, where "adjacent" cells are those horizontally or vertically neighboring. The same letter cell may not be used more than once in a word.
For example,
Given words = ["oath","pea","eat","rain"]
and board =
[ ['o','a','a','n'], ['e','t','a','e'], ['i','h','k','r'], ['i','f','l','v']]Return
["eat","oath"]
给定多个string组成的数组,要求从一个二维数组里能找到对应的“相邻字母构成这些string”,相邻字母要求:
1 同行或者同列;2 在匹配一个string时同一个字母最多使用一次。
很明显,要得到一个多结果的数组,可以通过回溯实现,由题目提示,用Tris树实现查找。
代码:
class TrieNode {public: vector<TrieNode*> child; bool isword; // Initialize your data structure here. TrieNode() : child(vector<TrieNode*>(26, NULL)), isword(false) {}};class Trie {public: Trie() : root(new TrieNode()) {} ~Trie() { delNode(root); } void delNode(TrieNode* n) { for(int i=0; i<26; ++i) { if(n->child[i]) delNode(n->child[i]); } delete n; } TrieNode* getroot() { return root; } // Inserts a word into the trie. void insert(string word) { TrieNode* n = root; for(auto ch:word) { if(n->child[ch-'a'] == NULL) n->child[ch-'a'] = new TrieNode(); n = n->child[ch-'a']; } n->isword = true; }private: TrieNode* root;};class Solution { public: void isexist(vector< vector<char> >& board,TrieNode*p,vector<string>&res,string s,int i,int j){p=p->child[board[i][j]-'a'];if(p){ s+=board[i][j]; if(p->isword){res.push_back(s);p->isword=0;//搜完即失效,以便其它的搜 } char c=board[i][j]; board[i][j]=0;//用完一次即可 if(i>0&&board[i-1][j])isexist(board,p,res,s,i-1,j); if(i<board.size()-1&&board[i+1][j])isexist(board,p,res,s,i+1,j); if(j>0&&board[i][j-1])isexist(board,p,res,s,i,j-1); if(j<board[0].size()-1&&board[i][j+1])isexist(board,p,res,s,i,j+1); board[i][j]=c;//还原 }//存在}vector<string> findWords(vector< vector<char> >& board,vector<string>& words){vector<string>res;int m=board.size();if(m<1)return res;int n=board[0].size();if(n<1)return res;Trie t;for(int i=0;i<words.size();i++) t.insert(words[i]);for(int i=0;i<m;i++) for(int j=0;j<n;j++)isexist(board,t.getroot(),res,"",i,j);return res;}};
阅读全文
0 0
- [leetcode] 212.Word Search II
- LeetCode 212. Word Search II
- leetcode.212. Word Search II
- [leetcode] 212. Word Search II
- Leetcode 212. Word Search II
- leetcode 212. Word Search II
- Leetcode 212. Word Search II
- Leetcode 212. Word Search II
- Leetcode 212. Word Search II
- LeetCode 212. Word Search II
- Leetcode 212. Word Search II
- LeetCode Word Search II
- [leetcode] Word Search II
- LeetCode Word Search II
- leetcode Word Search II
- LeetCode - Word Search II
- [leetcode]Word Search II
- leetcode Word Search II
- Python 命令行参数
- hdu题目分类
- HIVE入门二之表DDL(一)
- 套路和局
- 多进程修改全局变量
- Leetcode 212. Word Search II
- JZOJ5249. 【NOIP2017提高A组模拟8.10】文本编辑器
- WebAPI路由、参数绑定
- 2017 暑假艾教集训 day10 (补zoj2112带修改的第k大)整体二分
- 【C语言】【unix c】运行时文件
- uboot-C语言环境初始化
- 使用的docker 镜像记录
- Windows编程--WaitForSingleObject函数
- 通过私有化构造器强化不可实例化的能力。