给出一个2D板和字典中的单词列表,找到棋盘上的所有单词。每个单词必须由顺序相邻单元格的字母构成。不能重复使用
来源:互联网 发布:破解收费辅助软件 编辑:程序博客网 时间:2024/05/14 04:32
本题源自leetcode 212
-----------------------------------------------------------------------
思路:
构造一个Trie单词查找树。然后用递归遍历棋盘。找到所有的单词。
代码:
class Trie{ public: int idx; bool leaf; Trie* children[26]; Trie(){ this->idx = 0; //如果当前节点是结尾,idx 是这个字符串在字典中的下标 this->leaf = false; //表示是否是一个字符串的结尾 fill_n(this->children,26,nullptr); //指向其从a-z的开始子串的指针。 } };public: void insertWords(Trie* root,vector<string>& words,int idx){ int len = words[idx].size(); int i = 0; while(i < len){ if(root->children[words[idx][i] - 'a'] == NULL) root->children[words[idx][i] - 'a'] = new Trie(); root = root->children[words[idx][i] - 'a']; i++; } root->leaf = true; root->idx = idx; } Trie* buildTrie(vector<string>& words){ Trie* root = new Trie(); for(int i = 0; i < words.size(); i++){ insertWords(root,words,i); } return root; } vector<string> findWords(vector<vector<char>>& board, vector<string>& words) { vector<string> res; int row = board.size(); if(row == 0) return res; int col = board[0].size(); if(col == 0) return res; int n = words.size(); if(n == 0) return res; Trie* root = buildTrie(words); for(int i = 0; i < row; i++){ for(int j = 0; j < col && n > res.size(); j++){ dfs(board,words,res,root,i,j,row,col); } } return res; } void dfs(vector<vector<char>>& board,vector<string>& words,vector<string>& res,Trie* root,int i,int j,int row,int col){ if(board[i][j] == '#') //已经访问过 return; char tmp = board[i][j]; if(root->children[tmp - 'a'] == NULL) return ; if(root->children[tmp - 'a']->leaf){ res.push_back(words[root->children[tmp - 'a']->idx]); root->children[tmp - 'a']->leaf = false; } board[i][j] = '#'; if(i > 0) dfs(board,words,res,root->children[tmp - 'a'],i-1,j,row,col); if(i < row - 1) dfs(board,words,res,root->children[tmp - 'a'],i+1,j,row,col); if(j > 0) dfs(board,words,res,root->children[tmp - 'a'],i,j-1,row,col); if(j < col - 1) dfs(board,words,res,root->children[tmp - 'a'],i,j+1,row,col); board[i][j] = tmp; }
阅读全文
0 0
- 给出一个2D板和字典中的单词列表,找到棋盘上的所有单词。每个单词必须由顺序相邻单元格的字母构成。不能重复使用
- 给出一个2D板和一个单词,找出这个单词是否存在于网格中。 该单词可以由顺序相邻单元的字母构成,其中“相邻”单元是水平或垂直相邻的单元。 相同的字母单元可能不会被多次使用。
- 面试题:将一个字符串数组中的字母按照以下规则排列:表中任何单词的首字母与其前面单词的尾字母相同! 要求:字符串只由小写字母构成,且每个字符串长度在2-100之间
- 找到一个单词的所有相似单词
- 给定一个字符串列表,找出单词中最长单词,可以用l列表中的其他单词一次构建一个字符。返回具有最小字典顺序的最长单词。
- 将字符串中的每个单词顺序进行颠倒,单词还是原来的单词,字母顺序不发生变化
- LeetCode练习<二> 将字符串中的每个单词的字母颠倒,单词顺序不变
- 一个单词单词字母交换,可得另一个单词,如army->mary,成为兄弟单词。提供一个单词,在字典中找到它的兄弟。描述数据结构和查询过程
- 将字符串中的每个单词顺序进行颠倒,单词还是原来的单词,字母顺序不发生变化,将字符串中的空格用 代替
- 百度面试题--给定一个单词,从字典查找该单词的所有兄弟单词
- 给定一个字符串s和一个单词dict的字典,在s中添加空格来构造一个句子,其中每个单词都是有效的字典单词。
- 阿里校招笔试——给定一个字符串S和有效单词的字典D,请确定可以插入到S中的最小空格数,使得最终的字符串完全由D中的有效单词组成,并输出解。
- 给你一个字符串s和一个长度相同的单词列表。 找出s中所有子字符串的起始索引,这些字符串中的每个单词只是一个字符串,没有任何中介字符。
- Hard 找到由其它单词组成的最长单词 @CareerCup
- 用STL中的map容器实现从很多单词找出所有只有一个字母不同的单词
- 计算字符串中的单词数. 单词:由空格分开的连续字母数字串。
- 计算字符串中的单词数(单词:由空格分开的连续字母数字串)
- 给定一个字符串,你需要颠倒每个单词中的字符顺序,同时仍然保留空白和初始的字顺序。
- WinForm状态栏实时显示当前时间
- html中内容垂直水平居中
- 方便好用的 Beautifulsoup
- C 标准库
- 用Android studio 生成jar包--->亲测可用
- 给出一个2D板和字典中的单词列表,找到棋盘上的所有单词。每个单词必须由顺序相邻单元格的字母构成。不能重复使用
- tp5批量删除
- ReactNative错误捕捉与处理
- 编译&使用jsoncpp (1.8.3) 中文编码 解决过程
- Android使用百度地图的SDK获取定位
- OpenGL环境配置(VS2013+win10)
- MySQL事务隔离级别详解
- 1036. 跟奥巴马一起编程(15) PAT乙级真题
- express 学习记录