2022-01-23:力扣425,单词方块。 给定一个单词集合 (没有重复),找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < m
2022-01-23:力扣425,单词方块。
给定一个单词集合 (没有重复),找出其中所有的 单词方块 。
一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < max(行数, 列数)) 来看都是相同的字符串。
例如,单词序列 [“ball”,“area”,“lead”,“lady”] 形成了一个单词方块,因为每个单词从水平方向看和从竖直方向看都是相同的。
注意:
单词个数大于等于 1 且不超过 500。
所有的单词长度都相同。
单词长度大于等于 1 且不超过 5。
每个单词只包含小写英文字母 a-z。
答案2022-01-23:
递归。所有单词的所有前缀都会成为key。
注意!课上介绍题目设定的时候,有一点点小错
题目描述如下:
给定n个字符串,并且每个字符串长度一定是n,请组成单词方阵,比如:
给定4个字符串,长度都是4,[“ball”,“area”,“lead”,“lady”]
可以组成如下的方阵:
b a l l
a r e a
l e a d
l a d y
什么叫单词方阵?如上的方阵可以看到,
第1行和第1列都是"ball",第2行和第2列都是"area",第3行和第3列都是"lead",第4行和第4列都是"lady"
所以如果有N个单词,单词方阵是指:
一个NN的二维矩阵,并且i行和i列都是某个单词,不要求全部N个单词都在这个方阵里。
请返回所有可能的单词方阵。
示例:
输入: words = [“abat”,“baba”,“atan”,“atal”]
输出: [[“baba”,“abat”,“baba”,“atal”],[“baba”,“abat”,“baba”,“atan”]]
解释:
可以看到输出里,有两个链表,代表两个单词方阵
第一个如下:
b a b a
a b a t
b a b a
a t a l
这个方阵里没有atan,因为不要求全部单词都在方阵里
第二个如下:
b a b a
a b a t
b a b a
a t a n
这个方阵里没有atal,因为不要求全部单词都在方阵里
课上说的是:一个NN的二维矩阵,并且i行和i列都是某个单词,要求全部N个单词都在这个方阵里
原题说的是:一个N*N的二维矩阵,并且i行和i列都是某个单词,不要求全部N个单词都在这个方阵里
讲的过程没错,但是介绍题意的时候,这里失误了
代码用golang编写。代码如下:
package main
import "fmt"
func main() {
ret := wordSquares([]string{"abat", "baba", "atan", "atal"})
fmt.Println(ret)
}
func wordSquares(words []string) [][]string {
n := len(words[0])
// 所有单词,所有前缀字符串,都会成为key!
map0 := make(map[string][]string)
for _, word := range words {
for end := 0; end <= n; end++ {
prefix := word[0:end]
map0[prefix] = append(map0[prefix], word)
}
}
ans := make([][]string, 0)
process(0, n, map0, &([]string{}), &ans)
return ans
}
// i, 当前填到第i号单词,从0开始,填到n-1
// map, 前缀所拥有的单词
// path, 之前填过的单词, 0...i-1填过的
// ans, 收集答案
func process(i, n int, map0 map[string][]string, path0 *[]string, ans *[][]string) {
if i == n {
pathc := make([]string, len(*path0))
copy(pathc, *path0)
*ans = append(*ans, pathc)
} else {
// 把限制求出来,前缀的限制!
builder := make([]byte, 0)
for _, pre := range *path0 {
builder = append(builder, pre[i])
}
prefix := string(builder)
if _, ok := map0[prefix]; ok {
for _, next := range map0[prefix] {
*path0 = append(*path0, next)
process(i+1, n, map0, path0, ans)
*path0 = (*path0)[0 : len(*path0)-1]
}
}
}
}
执行结果如下:

2022-01-23:力扣425,单词方块。 给定一个单词集合 (没有重复),找出其中所有的 单词方块 。 一个单词序列形成了一个有效的单词方块的意思是指从第 k 行和第 k 列 (0 ≤ k < m的更多相关文章
- 力扣(LeetCode)删除排序链表中的重复元素II 个人题解
给定一个排序链表,删除所有含有重复数字的节点,只保留原始链表中 没有重复出现 的数字. 思路和上一题类似(参考 力扣(LeetCode)删除排序链表中的重复元素 个人题解)) 只不过这里需要用到一个前 ...
- 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列
问题 给出两个单词(start和end)与一个字典,找出从start到end的最短转换序列.规则如下: 一次只能改变一个字母 中间单词必须在字典里存在 例如: 给出 start = "hit ...
- 力扣(LeetCode)删除排序链表中的重复元素 个人题解
给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 这题思路比较简单,同样是快慢针的思路. 用一个整数类型val对应最新的只出现过一次的那个值, 如果节点的下一个节点的值和这个对应则不做别 ...
- C++双指针滑动和利用Vector实现无重复字符的最长子串—力扣算法
题目: 力扣原题链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/ 给定一个字符串, ...
- 力扣 ——3Sum python (三数之和)实现
题目描述: 中文: 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a + b + c = 0 ?找出所有满足条件且不重复的三元组. 英文: Give ...
- 面试经典:链表中倒数第k个结点?如何从大量数据中找出高频词?
记录两道面试题: 题目描述: 输入一个链表,输出该链表中倒数第k个结点.(单向链表) 拿到这个问题的时候自然而然会想到让链表从末尾开始next K-1 次不就是第K-1个节点了么,但是必须要注意一 ...
- 力扣 - 剑指 Offer 22. 链表中倒数第k个节点
题目 剑指 Offer 22. 链表中倒数第k个节点 思路1(栈) 既然要倒数第k个节点,那我们直接把所有节点放到栈(先进后出)里面,然后pop弹出k个元素就可以了 代码 class Solution ...
- 力扣 - 剑指 Offer 54. 二叉搜索树的第k大节点
题目 剑指 Offer 54. 二叉搜索树的第k大节点 思路1 二叉搜索树的特性就是中序遍历结果为递增序列,而题目要求的是第 k 大节点,所以就应该是要遍历结果为降序, 按照先遍历左子树.输出节点.遍 ...
- 【力扣】有序矩阵中第K小的元素
给定一个 n x n 矩阵,其中每行和每列元素均按升序排序,找到矩阵中第 k 小的元素.请注意,它是排序后的第 k 小元素,而不是第 k 个不同的元素. 示例: matrix = [ [ 1, 5, ...
- 力扣——Reverse Nodes in k-Group(K 个一组翻转链表) python实现
题目描述: 中文: 给你一个链表,每 k 个节点一组进行翻转,请你返回翻转后的链表. k 是一个正整数,它的值小于或等于链表的长度. 如果节点总数不是 k 的整数倍,那么请将最后剩余的节点保持原有顺序 ...
随机推荐
- svn操作方法
1.SVN1.1.SVN概述1.1.1.为什么需要使用svn版本控制软件协作开发远程开发版本回退 1.1.2.解决之道SCM:软件配置管理所谓的软件配置管理实际就是对软件源代码进行控制与管理. CVS ...
- NSIS 将一整个文件夹拷贝
在做安装包的时候,有时候需要将文件夹以及文件夹下面所包含的所有文件夹和文件都拷贝到目标文件夹,一下有两种方法可以连同文件夹一起拷贝: 各文件的位置如下: 其中src 文件夹下的文件如下: 一开始dst ...
- 区块链技术与应用:02-BTC-密码学原理
本文为个人整理笔记,知识点来源于北京大学肖臻老师的<区块链技术与应用>公开课视频:https://www.bilibili.com/video/BV1Vt411X7JF?from=sear ...
- 打开CMD方式
打开CMD的方式 win+r 输入cmd 常用的Dos命令 1.#盘符切换2.#查看当前文件目录下的所有文件 dir3.#切换目录 cd change directory4.#cd .. 返回上级5. ...
- 2020杭电多校第四场 Go Running 最小点覆盖等于二分图最大匹配数
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6808 思路:刚开始也是乱想,想几下就忍不住画个t-x图像,然后每个点有两种可能,一是向西跑,一是向东跑 ...
- 我用ChatGPT做WebRTC音视频性能优化,主打一个高效
摘要 随着GPT-4的发布,AI的风越吹越旺.GPT-4可以回答问题,可以写作,甚至可以基于一张草图生成html代码搭建一个网站.即构社区的一位开发者@倪同学就基于目前在研究的WebRTC QOS技术 ...
- 机器学习基础05DAY
分类算法之k-近邻 k-近邻算法采用测量不同特征值之间的距离来进行分类 优点:精度高.对异常值不敏感.无数据输入假定 缺点:计算复杂度高.空间复杂度高 使用数据范围:数值型和标称型 一个例子弄懂k-近 ...
- Go语言:一文看懂什么是DI依赖注入(dependency injection)设计模式
前言: 本文主要介绍的是Goalng中关于 DI 的部分,前一部分会先通过典型的面向对象语言Java引入DI这个概念 仅供初学者理解使用,文章如有纰漏敬请指出 本文涉及到的知识面较为零散,其中包含面向 ...
- 源码解读之FutureTask如何实现最大等待时间
预备知识:Java 线程挂起的常用方式有以下几种 Thread.sleep(long millis):这个方法可以让线程挂起一段时间,并释放 CPU 时间片,等待一段时间后自动恢复执行.这种方式可以用 ...
- 一文详解扩散模型:DDPM
作者:京东零售 刘岩 扩散模型讲解 前沿 人工智能生成内容(AI Generated Content,AIGC)近年来成为了非常前沿的一个研究方向,生成模型目前有四个流派,分别是生成对抗网络(Gene ...