文章目录

  • 1. 题目
  • 2. 解题

1. 题目

给定一个单词集合 (没有重复),找出其中所有的 单词方块 。

一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。

例如,单词序列 ["ball","area","lead","lady"] 形成了一个单词方块,因为每个单词从水平方向看和从竖直方向看都是相同的。

b a l l
a r e a
l e a d
l a d y
注意:
单词个数大于等于 1 且不超过 500。
所有的单词长度都相同。
单词长度大于等于 1 且不超过 5。
每个单词只包含小写英文字母 a-z。示例 1:
输入:
["area","lead","wall","lady","ball"]
输出:
[[ "wall","area","lead","lady"],[ "ball","area","lead","lady"]
]
解释:
输出包含两个单词方块,输出的顺序不重要,
只需要保证每个单词方块内的单词顺序正确即可。 示例 2:
输入:
["abat","baba","atan","atal"]
输出:
[[ "baba","abat","baba","atan"],[ "baba","abat","baba","atal"]
]解释:
输出包含两个单词方块,输出的顺序不重要,
只需要保证每个单词方块内的单词顺序正确即可。

来源:力扣(LeetCode) 链接:https://leetcode-cn.com/problems/word-squares
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

2. 解题

类似题目:程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

  • trie 的每个节点记录经过该节点的单词下标
class trie
{public:bool isEnd = false;trie* next[26] = {NULL};vector<int> wd;//经过该节点的单词下标void insert(string& s, int idx){trie *cur = this;for(int i = 0; i < s.size(); ++i){if(!cur->next[s[i]-'a'])cur->next[s[i]-'a'] = new trie();cur = cur->next[s[i]-'a'];cur->wd.push_back(idx);}cur->isEnd = true;}
};
class Solution {vector<vector<string>> ans;int n;
public:vector<vector<string>> wordSquares(vector<string>& words) {trie* t = new trie();for(int i = 0; i < words.size(); ++i)t->insert(words[i], i);n = words[0].size();vector<string> mat;for(auto& w : words){mat.push_back(w);//以每个单词为1第一行,开始查找dfs(words, t, mat, 1);mat.pop_back();}return ans;}void dfs(vector<string>& words, trie* t, vector<string>& mat, int len){if(len == n){ans.push_back(mat);return;}string nextprefix;//获取下一行的前缀for(int i = 0; i < len; ++i)nextprefix += mat[i][len];trie* cur = t;for(int i = 0; i < nextprefix.size(); ++i){    //在trie中检查前缀是否存在if(!cur->next[nextprefix[i]-'a']) return;cur = cur->next[nextprefix[i]-'a'];}for(int wd_idx : cur->wd){   //存在前缀,在当前节点的单词中加入下一个单词mat.push_back(words[wd_idx]);dfs(words, t, mat, len+1);mat.pop_back();}}
};

160 ms 16.9 MB


我的CSDN博客地址 https://michael.blog.csdn.net/

长按或扫码关注我的公众号(Michael阿明),一起加油、一起学习进步!

LeetCode 425. 单词方块(Trie树+DFS)相关推荐

  1. 程序员面试金典 - 面试题 17.25. 单词矩阵(Trie树+DFS回溯,hard)

    1. 题目 给定一份单词的清单,设计一个算法,创建由字母组成的面积最大的矩形,其中每一行组成一个单词(自左向右),每一列也组成一个单词(自上而下). 不要求这些单词在清单里连续出现,但要求所有行等长, ...

  2. LeetCode 212. 单词搜索 II(Trie树+DFS)

    1. 题目 给定一个二维网格 board 和一个字典中的单词列表 words,找出所有同时在二维网格和字典中出现的单词. 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中"相邻&qu ...

  3. Trie树 + DFS - CSU 1457 Boggle

    Boggle Problem's Link:  http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1457 Mean: 给定n个串,有m个询问. 每个询 ...

  4. LeetCode 720. 词典中最长的单词(Trie树)

    1. 题目 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. 若无 ...

  5. LeetCode 758. 字符串中的加粗单词(Trie树)

    文章目录 1. 题目 2. 解题 1. 题目 给定一个关键词集合 words 和一个字符串 S,将所有 S 中出现的关键词加粗.所有在标签 <b> 和 </b> 中的字母都会加 ...

  6. 720 词典中最长的单词(Trie树)

    1. 问题描述: 给出一个字符串数组words组成的一本英语词典.从中找出最长的一个单词,该单词是由words词典中其他单词逐步添加一个字母组成.若其中有多个可行的答案,则返回答案中字典序最小的单词. ...

  7. 【bzoj4567】[Scoi2016]背单词 贪心+trie树

    我个傻逼,这么水的题还调了那么久. 把所有的串都反过来,建trie树,很明显,不同子树间是不影响的. 一定是先选择父亲节点再选子节点,同一个节点先选子树大小最小的儿子即可. 一开始想错了,以为可以直接 ...

  8. F. Paper Grading(Trie树+dfs序+二维数点)

    F. Paper Grading 大佬题解 一般关于前缀的问题基本都是Trie树. 首先将所给字符串建立一棵Trie树,Trie能够解决一个字符串在一个字符串集合中出现的次数,而查询前缀次数只需要找到 ...

  9. 【BZOJ3439】Kpm的MC密码,trie树+dfs序+主席树

    Time:2016.05.07 Author:xiaoyimi 转载注明出处谢谢 传送门 思路: 1.have a trie,还得是倒着建的,记录每个结尾节点的id(可能会有重复,所以开一个vecto ...

最新文章

  1. 机器学习获量子加速!物理学家与计算科学家「自然联姻」
  2. 扩展webupload插件,增加ui界面
  3. datagrip启动时报错Internal error
  4. 利用pre-compiled headers技术以加速编译速度(一)
  5. Oracle 12c因bug导致ORA-04031问题处理过程 | 云和恩墨技术通讯精选
  6. python3 开发面试题(面向对象)6.6
  7. 设置字符串位数,不足位数补0
  8. mathtype安装教程
  9. 适用于上门预约的门店小程序源码及管理系统,包含小程序源码!
  10. linux php验证码无法显示,PHPCMS在Linux下后台验证码无法显示的解决方法
  11. Java基础9----运算符2(关系,逻辑运算符)
  12. 两个步骤解决 SQL Server 登录报错 通过端口 1433 连接到主机 的 TCP/IP 连接失败。 错误:“connect timed out”
  13. 使用Axure RP实现页面跳转、弹窗显示、单选按钮、下拉框以及图片插入
  14. 四种常见的ps怎么模糊背景的方法
  15. html 文字加点 样式,中文网页重设与排版:TYPO.CSS
  16. Win10内核驱动强制签名,必须要有 EV代码签名证书
  17. 2022:“客服外包平台”的服务流程是什么
  18. scope=both和scope=spfile
  19. 秀米的对话框格子可以变大吗_漫画的对话框大小跟字数怎么才能在分镜的格子里正确配合?...
  20. oracle lob表空间,如何将Oracle(C)LOB导入另一个表空间

热门文章

  1. 异常检测算法之LOF
  2. 玩Linux碰到的问题以及使用技巧总结
  3. html标签api,html5新增标签+API介绍
  4. matlab %3c handle,volume browser (updated).htm 源代码在线查看 - Matlab显式三维地震数据的源代码 资源下载 虫虫电子下载站...
  5. java中钩子函数回调函数_钩子函数 和回调函数
  6. citespace安装如何配置JAVA_citespace超详细安装教程
  7. html如何制作滑块,网页制作html5实现滑块功能之type=quot;rangequot;属性-建站-建站教程-建站方法-米云建站 - 米云问答...
  8. LAMP环境安装与apache配置
  9. 简单几何(极角排序) POJ 2007 Scrambled Polygon
  10. java-设计模式(结构型)-【代理模式】