1513. 仅含 1 的子串数
大约 2 分钟
---
1513. 仅含 1 的子串数
- 标签:数学、字符串
- 难度:中等
题目链接
题目大意
描述:给定一个二进制字符串 。
要求:返回所有字符都为 的子字符串数目。结果对 取模。
说明:
- 。
示例:
- 示例 1:
输入:s = "0110111"
输出:9
解释:共有 9 个子字符串仅由 '1' 组成
"1" -> 5 次
"11" -> 3 次
"111" -> 1 次- 示例 2:
输入:s = "101"
输出:2
解释:子字符串 "1" 在 s 中共出现 2 次解题思路
思路 1:一次遍历
1. 核心思想
遍历字符串,统计连续 的段的长度。对于长度为 的连续 段,其包含的全 子串数为 。
2. 具体步骤
第 1 步:,连续计数 。
第 2 步:遍历每个字符:
- 如果是
'1':。 - 如果是
'0':,。
第 3 步:处理末尾的连续 。
第 4 步:返回 。
3. 举例说明
以 为例:
- :
'0',。 - :
'1',。 - :
'1',。 - :
'0',,。 - :
'1',。 - :
'1',。 - :
'1',。 - 结束:。
。
验证:段 "11": 个字符,子串 (第 个)、(第 个)、 → 个。
段 "111": 个字符,子串 个。共 个。
思路 1:代码
class Solution:
def numSub(self, s: str) -> int:
MOD = 10 ** 9 + 7
ans = 0
cnt = 0
for ch in s:
if ch == '1':
cnt += 1
else:
ans = (ans + cnt * (cnt + 1) // 2) % MOD
cnt = 0
ans = (ans + cnt * (cnt + 1) // 2) % MOD
return ans思路 1:复杂度分析
- 时间复杂度:。
- 空间复杂度:。