Skip to content

Commit ee7d403

Browse files
author
lucifer
committed
feat: 上界说明
1 parent 45b2dff commit ee7d403

File tree

1 file changed

+10
-17
lines changed

1 file changed

+10
-17
lines changed

problems/686.repeated-string-match.md

Lines changed: 10 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -80,30 +80,23 @@ return -1
8080

8181
因此我们必须设计出口,并返回 -1。问题的我们的上界是什么呢?
8282

83-
这里有个概念叫**解空间**。这是一个很重要的概念。 我举个简单的例子。 你要在一个数组 A 中找某一个数的索引,题目保证这个数字一定在数组中存在。那么这道题的解空间就是**[0, n -1]**,其中 n 为数组长度。你的解不可能在这个范围外。
83+
这里有个概念叫**解空间**。这是一个很重要的概念。 我举个简单的例子。 你要在一个数组 A 中找某一个数的索引,题目保证这个数字一定在数组中存在。那么这道题的解空间就是 **[0, n -1]**,其中 n 为数组长度。你的解不可能在这个范围外。
8484

85-
回到本题,如果 a 经过 n 次可以匹配成功, 那么最终 a 的长度范围是 [len(b), 2 * len(a) + len(b)],下界是 len(b) 容易理解, 关键是上界
85+
回到本题,如果 a 经过 n 次可以匹配成功, 那么最终 a 的长度范围是 [len(b), 2 * len(a) + len(b)]
8686

87-
还是以上面的例子来说
87+
下界是 len(b) 容易理解, 关键是上界
8888

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)
89+
假设 a 循环 n 次可以包含 b。那么必定属于以下几种情况中的一种:
9990

100-
临界情况就是:
91+
> 循环次数下界为 len(b) + len(a ) - 1 / len(a)
10192
102-
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5ah357i0j30wx07v754.jpg)
93+
1. 循环 n 次正好匹配。 比如 a = 'abc', b = 'abcabcabcabcabc'(5 个 abc)。循环 5 次恰好匹配,这五次循环其实就是上面提到到**下界**
94+
2. 第 n 次循环恰好匹配,这个时候第 n 次循环的前 k 个字符必定匹配(其中 0 < k <= len(a)),比如 a = 'abc', b = 'abcabcab'。第三次匹配正好匹配,且匹配了 abc 中的前两个字符 ab,也就是说比下界**多循环一次**
95+
3. 再比如: a = "ab", b = "bababa",那么需要循环 5 次 变成 a**babababa**b(粗体表示匹配 b 的部分),其中 3 次是下界,也就是说比下界多循环了**两次**
10396

104-
![](https://tva1.sinaimg.cn/large/0081Kckwly1gk5aft6jkhj308c03faa3.jpg)
97+
除此之前没有别的可能。
10598

106-
因此最终 a 的长度的临界值就是 2 \* len(a) + len(b)。**超过这个范围再多次的叠加也没有意义。**
99+
可以看出实际上 n 不会大于**下界次循环 + 2**因此最终 a 的长度的临界值就是 2 \* len(a) + len(b)。**超过这个范围再多次的叠加也没有意义。**
107100

108101
## 关键点解析
109102

0 commit comments

Comments
 (0)