1513-仅含 1 的子串数
给你一个二进制字符串 s
(仅由 ‘0’ 和 ‘1’ 组成的字符串)。
返回所有字符都为 1 的子字符串的数目。
由于答案可能很大,请你将它对 10^9 + 7 取模后返回。
示例 1:
**输入:** s = "0110111"
**输出** :9
**解释:** 共有 9 个子字符串仅由 '1' 组成
"1" -> 5 次
"11" -> 3 次
"111" -> 1 次
示例 2:
**输入:** s = "101"
**输出:** 2
**解释:** 子字符串 "1" 在 s 中共出现 2 次
示例 3:
**输入:** s = "111111"
**输出:** 21
**解释:** 每个子字符串都仅由 '1' 组成
示例 4:
**输入:** s = "000"
**输出:** 0
提示:
s[i] == '0'
或s[i] == '1'
1 <= s.length <= 10^5
方法一:遍历字符串寻找最长子串
如果一个所有字符都为 1
的字符串的长度为 k
,则该字符串包含的所有字符都为 1
的子字符串(包括该字符串本身)的数量是 k * (k + 1) / 2
。
首先寻找到所有的只包含字符 1
的最长子字符串。这里的「只包含字符 1
的最长子字符串」的意思是,假设该子字符串的下标范围是 [i, j]
(包含下标 i
和下标 j
),其中 i <= j
,该子字符串中的所有字符都是 1
,且下标 i
满足 i
位于字符串 s
的最左侧或者下标 i - 1
位置的字符是 0
,以及下标 j
满足 j
位于字符串 s
的最右侧或者下标 j + 1
位置的字符是 0
。
寻找到所有的只包含字符 1
的最长子字符串之后,就可以计算所有字符都为 1
的子字符串的数量。
具体做法是,从左到右遍历字符串,如果遇到字符 1
则计算连续字符 1
的数量,如果遇到字符 0
则说明上一个只包含字符 1
的最长子字符串遍历结束,根据最长子字符串的长度计算子字符串的数量,然后将连续字符 1
的数量清零。遍历结束后,如果连续字符 1
的数量大于零,则还有最后一个只包含字符 1
的最长子字符串,因此还需要计算其对应的子字符串的数量。
1 | class Solution { |
1 | class Solution { |
1 | class Solution: |
复杂度分析
时间复杂度:O(n),其中 n 是字符串的长度。需要遍历字符串一次。
空间复杂度:O(1)。只需要维护有限的变量,空间复杂度是常数。
Comments