Description#
Given a binary string s
, return the number of substrings with all characters 1
's. Since the answer may be too large, return it modulo 109 + 7
.
Example 1:
Input: s = "0110111"
Output: 9
Explanation: There are 9 substring in total with only 1's characters.
"1" -> 5 times.
"11" -> 3 times.
"111" -> 1 time.
Example 2:
Input: s = "101"
Output: 2
Explanation: Substring "1" is shown 2 times in s.
Example 3:
Input: s = "111111"
Output: 21
Explanation: Each substring contains only 1's characters.
Constraints:
1 <= s.length <= 105
s[i]
is either '0'
or '1'
.
Solutions#
Solution 1#
1
2
3
4
5
6
7
8
9
10
| 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)
|
1
2
3
4
5
6
7
8
9
10
11
| 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;
}
}
|
1
2
3
4
5
6
7
8
9
10
11
12
| 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;
}
};
|
1
2
3
4
5
6
7
8
9
10
11
12
13
| 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
}
|
1
2
3
4
5
6
7
8
9
10
| 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;
}
|