给你一个二进制字符串 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
方法一:遍历计数
我们遍历字符串
遍历结束,返回
时间复杂度
相似题目:
class Solution:
def numSub(self, s: str) -> int:
ans = cnt = 0
for c in s:
if c == "1":
cnt += 1
else:
cnt = 0
ans += cnt
return ans % (10**9 + 7)
class Solution {
public int numSub(String s) {
final int mod = (int) 1e9 + 7;
int ans = 0, cnt = 0;
for (int i = 0; i < s.length(); ++i) {
cnt = s.charAt(i) == '1' ? cnt + 1 : 0;
ans = (ans + cnt) % mod;
}
return ans;
}
}
class Solution {
public:
int numSub(string s) {
int ans = 0, cnt = 0;
const int mod = 1e9 + 7;
for (char& c : s) {
cnt = c == '1' ? cnt + 1 : 0;
ans = (ans + cnt) % mod;
}
return ans;
}
};
func numSub(s string) (ans int) {
const mod = 1e9 + 7
cnt := 0
for _, c := range s {
if c == '1' {
cnt++
} else {
cnt = 0
}
ans = (ans + cnt) % mod
}
return
}
function numSub(s: string): number {
const mod = 10 ** 9 + 7;
let ans = 0;
let cnt = 0;
for (const c of s) {
cnt = c == '1' ? cnt + 1 : 0;
ans = (ans + cnt) % mod;
}
return ans;
}