Medium

Number of Ways to Split a StringC++

Full explanation · Time O(n) · Space O(1)

// Time:  O(n)
// Space: O(1)

class Solution {
public:
    int numWays(string s) {
        static const int MOD = 1e9 + 7;
        int ones = count_if(cbegin(s), cend(s),
                            [](const auto& x) {
                                return x == '1';
                            });
        if (ones % 3) {
            return 0;
        }
        ones /= 3;
        if (ones == 0) {
            return static_cast<int64_t>(s.length() - 1) * (s.length() - 2) / 2 % MOD;
        }
        int count = 0, left = 0, right = 0;
        for (const auto& c : s) {
            if (c == '1') {
                ++count;
            }
            if (count == ones) {
                ++left;
            } else if (count == 2 * ones) {
                ++right;
            }
        }
        return static_cast<int64_t>(left) * right % MOD;
    }
};