problem

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'.

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
    }
}