LC 3234. 统计 1 显著的字符串的数量
https://leetcode.cn/problems/count-the-number-of-substrings-with-dominant-ones/description/
这题突破口还是平方这个地方。所以一般来说如果N~=10^4这个范围上,并且有平方的话,那么复杂度可能就是O(n sqrt(n)).
这题实现思路上是,枚举所有出现0的位置点,然后0出现的次数不会超过O(sqrt(n))个,所以复杂度就是在O(n sqrt(n))上。
枚举0的位置点之后,假设
- l 这个位置下一个出现0的位置是r0, 那么最开始从 \([l,r0-1]\) 这些位置全部是1
- 假设 \([l,r0]\) 之间存在 \(zero\) 个0的话,接下来 \([r0+1, pos[r0]]\) 里面就全部是1
- 我们可以计算需要从 \([r0+1, pos[r0]]\) 里面选出多少个1出来才能满足条件
- 接下来 \(r0 = pos[r0]\), 那么从 \([l,r0]\) 之间就存在 \(zero+1\) 个0. 如此循环
class Solution: def numberOfSubstrings(self, s: str) -> int: n = len(s) pos = [n] * (n + 1) for i in reversed(range(n)): pos[i] = i if s[i] == '0' else pos[i + 1] ans = 0 for l in range(n): zero = 0 r0 = pos[l] # [l..r0][r0+1..r1) # s[r0/r1] == '0' ans += (r0 - l) while r0 < n: zero += 1 if zero * zero > (n - l): break r1 = pos[r0 + 1] a = (r0 - l + 1) - zero b = max(zero * zero - a, 0) if b > (n - r0): break r = max(r1 - r0 - b, 0) ans += r r0 = r1 return ans