Description (leetcode)

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 10^9 + 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 <= 10^5
  • s[i] is either '0' or '1'.

submission

// should be straight forward enough
impl Solution {
    pub fn num_sub(s: String) -> i32 {
        (s.as_bytes()
            // chunk by different bytes
            .chunk_by(|a, b| a == b)
            .filter_map(|chunk| {
                // check if this is a chunk of '1's
                matches!(chunk, &[b'1', ..])
                    .then(|| {
                        // contribution of this chunk
                        chunk.len() * (chunk.len() + 1) / 2 % 1000000007
                    })
            })
            // accumulate
            .sum::<usize>() % 1000000007) as i32
    }
}