Skip to content

Commit 2a7de26

Browse files
author
lucifer
committed
feat: $686
1 parent 2d99ffb commit 2a7de26

File tree

4 files changed

+150
-9
lines changed

4 files changed

+150
-9
lines changed

SUMMARY.md

+1
Original file line numberDiff line numberDiff line change
@@ -163,6 +163,7 @@
163163
* [0560. 和为K的子数组](problems/560.subarray-sum-equals-k.md)
164164
* [0609. 在系统中查找重复文件](problems/609.find-duplicate-file-in-system.md)
165165
* [0611. 有效三角形的个数](problems/611.valid-triangle-number.md)
166+
* [0686. 重复叠加字符串匹配](problems/686.repeated-string-match.md)
166167
* [0718. 最长重复子数组](problems/718.maximum-length-of-repeated-subarray.md)
167168
* [0754. 到达终点数字](problems/754.reach-a-number.md)
168169
* [0785. 判断二分图](problems/785.is-graph-bipartite.md)

collections/medium.md

+8-7
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
- [0011. 盛最多水的容器](../problems/11.container-with-most-water.md)
1515
- [0015. 三数之和](../problems/15.3sum.md)
1616
- [0017. 电话号码的字母组合](../problems/17.Letter-Combinations-of-a-Phone-Number.md)
17-
- [0019. 删除链表的倒数第N个节点](../problems/19.removeNthNodeFromEndofList.md)
17+
- [0019. 删除链表的倒数第 N 个节点](../problems/19.removeNthNodeFromEndofList.md)
1818
- [0022. 括号生成](../problems/22.generate-parentheses.md)
1919
- [0024. 两两交换链表中的节点](../problems/24.swapNodesInPairs.md)
2020
- [0029. 两数相除](../problems/29.divide-two-integers.md)
@@ -29,7 +29,7 @@
2929
- [0050. Pow(x, n)](../problems/50.pow-x-n.md)
3030
- [0055. 跳跃游戏](../problems/55.jump-game.md)
3131
- [0056. 合并区间](../problems/56.merge-intervals.md)
32-
- [0060. 第k个排列](../problems/60.permutation-sequence.md)
32+
- [0060. 第 k 个排列](../problems/60.permutation-sequence.md)
3333
- [0062. 不同路径](../problems/62.unique-paths.md)
3434
- [0073. 矩阵置零](../problems/73.set-matrix-zeroes.md)
3535
- [0075. 颜色分类](../problems/75.sort-colors.md)
@@ -59,11 +59,11 @@
5959
- [0201. 数字范围按位与](../problems/201.bitwise-and-of-numbers-range.md)
6060
- [0208. 实现 Trie (前缀树)](../problems/208.implement-trie-prefix-tree.md)
6161
- [0209. 长度最小的子数组](../problems/209.minimum-size-subarray-sum.md)
62-
- [0211. 添加与搜索单词 * 数据结构设计](../problems/211.add-and-search-word-data-structure-design.md)
63-
- [0215. 数组中的第K个最大元素](../problems/215.kth-largest-element-in-an-array.md)
62+
- [0211. 添加与搜索单词 \* 数据结构设计](../problems/211.add-and-search-word-data-structure-design.md)
63+
- [0215. 数组中的第 K 个最大元素](../problems/215.kth-largest-element-in-an-array.md)
6464
- [0221. 最大正方形](../problems/221.maximal-square.md)
6565
- [0229. 求众数 II](../problems/229.majority-element-ii.md)
66-
- [0230. 二叉搜索树中第K小的元素](../problems/230.kth-smallest-element-in-a-bst.md)
66+
- [0230. 二叉搜索树中第 K 小的元素](../problems/230.kth-smallest-element-in-a-bst.md)
6767
- [0236. 二叉树的最近公共祖先](../problems/236.lowest-common-ancestor-of-a-binary-tree.md)
6868
- [0238. 除自身以外数组的乘积](../problems/238.product-of-array-except-self.md)
6969
- [0240. 搜索二维矩阵 II](../problems/240.search-a-2-d-matrix-ii.md)
@@ -75,7 +75,7 @@
7575
- [0337. 打家劫舍 III](../problems/337.house-robber-iii.md)
7676
- [0343. 整数拆分](../problems/343.integer-break.md)
7777
- [0365. 水壶问题](../problems/365.water-and-jug-problem.md)
78-
- [0378. 有序矩阵中第K小的元素](../problems/378.kth-smallest-element-in-a-sorted-matrix.md)
78+
- [0378. 有序矩阵中第 K 小的元素](../problems/378.kth-smallest-element-in-a-sorted-matrix.md)
7979
- [0380. 常数时间插入、删除和获取随机元素](../problems/380.insert-delete-getrandom-o1.md)
8080
- [0416. 分割等和子集](../problems/416.partition-equal-subset-sum.md)
8181
- [0445. 两数相加 II](../problems/445.add-two-numbers-ii.md)
@@ -84,9 +84,10 @@
8484
- [0516. 最长回文子序列](../problems/516.longest-palindromic-subsequence.md)
8585
- [0518. 零钱兑换 II](../problems/518.coin-change-2.md)
8686
- [0547. 朋友圈](../problems/547.friend-circles.md)
87-
- [0560. 和为K的子数组](../problems/560.subarray-sum-equals-k.md)
87+
- [0560. 和为 K 的子数组](../problems/560.subarray-sum-equals-k.md)
8888
- [0609. 在系统中查找重复文件](../problems/609.find-duplicate-file-in-system.md)
8989
- [0611. 有效三角形的个数](../problems/611.valid-triangle-number.md)
90+
- [0686. 重复叠加字符串匹配](../problems/686.repeated-string-match.md) 🆕
9091
- [0718. 最长重复子数组](../problems/718.maximum-length-of-repeated-subarray.md)
9192
- [0754. 到达终点数字](../problems/754.reach-a-number.md)
9293
- [0785. 判断二分图](../problems/785.is-graph-bipartite.md)

problems/611.valid-triangle-number.md

+3-2
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
## 题目地址(611. 有效三角形的个数)
2+
23
https://leetcode-cn.com/problems/valid-triangle-number/
34

45
## 题目描述
@@ -29,14 +30,14 @@ https://leetcode-cn.com/problems/valid-triangle-number/
2930
- 二分法
3031
- 三角形边的关系
3132

32-
## 暴力法(超时)
33-
3433
## 公司
3534

3635
- 腾讯
3736
- 百度
3837
- 字节
3938

39+
## 暴力法(超时)
40+
4041
### 思路
4142

4243
首先要有一个数学前提: `如果三条线段中任意两条的和都大于第三边,那么这三条线段可以组成一个三角形`。即给定三个线段 a,b,c,如果满足 a + b > c and a + c > b and b + c > a,则线段 a,b,c 可以构成三角形,否则不可以。

problems/686.repeated-string-match.md

+138
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,138 @@
1+
## 题目地址(686. 重复叠加字符串匹配)
2+
3+
https://leetcode-cn.com/problems/repeated-string-match/description/
4+
5+
## 题目描述
6+
7+
```
8+
给定两个字符串 a 和 b,寻找重复叠加字符串 a 的最小次数,使得字符串 b 成为叠加后的字符串 a 的子串,如果不存在则返回 -1。
9+
10+
注意:字符串 "abc" 重复叠加 0 次是 "",重复叠加 1 次是 "abc",重复叠加 2 次是 "abcabc"。
11+
12+
 
13+
14+
示例 1:
15+
16+
输入:a = "abcd", b = "cdabcdab"
17+
输出:3
18+
解释:a 重复叠加三遍后为 "abcdabcdabcd", 此时 b 是其子串。
19+
示例 2:
20+
21+
输入:a = "a", b = "aa"
22+
输出:2
23+
示例 3:
24+
25+
输入:a = "a", b = "a"
26+
输出:1
27+
示例 4:
28+
29+
输入:a = "abc", b = "wxyz"
30+
输出:-1
31+
 
32+
33+
提示:
34+
35+
1 <= a.length <= 104
36+
1 <= b.length <= 104
37+
a 和 b 由小写英文字母组成
38+
39+
40+
```
41+
42+
## 前置知识
43+
44+
- set
45+
46+
## 公司
47+
48+
- 暂无
49+
50+
## 思路
51+
52+
首先,一个容易发现的点是**如果 b 中包含有 a 中没有的字符, 那么一定需要返回 - 1**。因此使用集合存储 a 和 b 的所有字符,并比较 b 是否是 a 的子集,如果不是,则直接返回 - 1。
53+
54+
接着我们逐个尝试:
55+
56+
- 两个 a 是否可以?
57+
- 三个 a 是否可以?
58+
- 。。。
59+
- n 个 a 是否可以?
60+
61+
如果可以,则直接返回 n 即可。关于是否可以的判断, 我们可以使用任何语言自带的 indexof 算法,Python 中 可以使用 `b in a ` 判读 b 时候是 a 的子串。
62+
63+
代码:
64+
65+
```py
66+
cnt = 1
67+
while True:
68+
if b in a * cnt:
69+
return cnt
70+
cnt += 1
71+
return -1
72+
```
73+
74+
上面的代码有 BUG,会在一些情况无限循环。比如:
75+
76+
```
77+
a = "abcabcabcabc"
78+
b = "abac"
79+
```
80+
81+
因此我们必须设计出口,并返回 -1。问题的我们的上界是什么呢?
82+
83+
这里有个概念叫**解空间**。这是一个很重要的概念。 我举个简单的例子。 你要在一个数组 A 中找某一个数的索引,题目保证这个数字一定在数组中存在。那么这道题的解空间就是**[0, n -1]**,其中 n 为数组长度。你的解不可能在这个范围外。
84+
85+
回到本题,如果 a 经过 n 次可以匹配成功, 那么最终 a 的长度范围是 [len(b), 2 * len(a) + len(b)],下界是 len(b) 容易理解, 关键是上界。
86+
87+
还是以上面的例子来说。
88+
89+
```
90+
a = "abcabcabcabc"
91+
b = "abac"
92+
```
93+
94+
abac 如果可以在其中匹配到,一定是以下几种情况:
95+
96+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5a36n5qqj310106s0t6.jpg)
97+
98+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5a4md3eyj30xv04y74n.jpg)
99+
100+
临界情况就是:
101+
102+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5ah357i0j30wx07v754.jpg)
103+
104+
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5aft6jkhj308c03faa3.jpg)
105+
106+
因此最终 a 的长度的临界值就是 2 \* len(a) + len(b)。**超过这个范围再多次的叠加也没有意义。**
107+
108+
## 关键点解析
109+
110+
- 答案是有限的, 搞清楚解空间是关键
111+
112+
## 代码
113+
114+
代码支持: Python
115+
116+
```py
117+
class Solution:
118+
def repeatedStringMatch(self, a: str, b: str) -> int:
119+
if not set(b).issubset(set(a)):
120+
return -1
121+
cnt = 1
122+
while len(a * cnt) < 2 * len(a) + len(b):
123+
if b in a * cnt:
124+
return cnt
125+
cnt += 1
126+
return -1
127+
```
128+
129+
**复杂度分析**
130+
131+
- 时间复杂度:b in a 的时间复杂度为 M + N(取决于内部算法),因此总的时间复杂度为 $O((M + N) ^ 2)$,其中 M 和 N 为 a 和 b 的长度。
132+
- 空间复杂度:由于使用了 set,因此空间复杂度为 $O(M +N)$,其中 M 和 N 为 a 和 b 的长度。
133+
134+
更多题解可以访问我的 LeetCode 题解仓库:https://github.com/azl397985856/leetcode 。 目前已经 37K star 啦。
135+
136+
关注公众号力扣加加,努力用清晰直白的语言还原解题思路,并且有大量图解,手把手教你识别套路,高效刷题。
137+
138+
![](https://tva1.sinaimg.cn/large/007S8ZIlly1ghlud0qh2oj30p00dwt9t.jpg)

0 commit comments

Comments
 (0)