代码
class Solution {
public:
// 1.统计1的数量的同时可以把1的下标用哈希表确定下来(思路)
// 2.1的总数除以3,得到t对用map的下标,就是第一个字符串的下标,2 * t就是第二堆的下标(思路)
// 3.要考虑1的数量为0的情况,那么就是n - 1个空放2个板子(思路+注意点)
// 4.记得考虑long long(注意点)
int numWays(string s) {
long long n = s.size();
int num = 0;
map<long long ,long long >mp;
for(int i = 0; i < n; i++){
if(s[i] == '1'){
num++;
mp[num] = i;//map记录每个序号的1所在的位置
}
}
if(num % 3) return 0;
if(!num) return ((n - 1) * (n - 2) / 2) % (1000000000 + 7 );
long long t = num / 3;
// cout << mp[t + 1] << mp[t] << mp[2 * t + 1] << mp[2 * t]<<endl;
return((mp[t + 1] - mp[t]) * (mp[2 * t + 1] - mp[2 * t])) %(1000000000 + 7);
}
};