**
题目:
给你一个二进制字符串 s(仅由 ‘0’ 和 ‘1’ 组成的字符串)。
返回所有字符都为 1 的子字符串的数目。
由于答案可能很大,请你将它对 10^9 + 7 取模后返回。
示例 1:
输入:s = “0110111”
输出:9
解释:共有 9 个子字符串仅由 ‘1’ 组成
“1” -> 5 次
“11” -> 3 次
“111” -> 1 次
示例 2:
输入:s = “101”
输出:2
解释:子字符串 “1” 在 s 中共出现 2 次
示例 3:
输入:s = “111111”
输出:21
解释:每个子字符串都仅由 ‘1’ 组成
示例 4:
输入:s = “000”
输出:0
提示:
s[i] == '0' 或 s[i] == '1'
1 <= s.length <= 10^5
**
提示:
*这题一不留神就溢出了,二不留神就超时了。。。。
思路的话挺简单的,就是遍历字符串,出现1的话就看这个子串有几个连续的“1”,将个数存储在数组tem里,比如说遍历“10110111011110”,tem的值就是1 2 3 4。然后计算长度为n的连续1字符串有(1+n)n/2种组合,计算完毕后求模。
代码如下:
int numSub(string s)
{
vector<long int> tem;//用来储存连续出现1的个数
int modd = pow(10, 9) + 7;
for (int i = 0; i < s.length(); )
{
if (s[i] == '1')//当前字符为1,判断后面是否是连续的1
{
int c = 1;
while (i + 1 < s.length() && s[i + 1] == '1')
{
c++;
i++;
}
tem.push_back(c);//将连续1的个数存入tem
i++;
}
else
i++;
}
int sum =0;
for(int i=0;i<tem.size();i++)
{
tem[i]=(1+tem[i])*tem[i]/2%modd;//计算长度为n的连续1字符串有(1+n)*n/2种组合,计算完毕后求模,不然就超时或者溢出了
sum+=tem[i];
}
return sum;
}
};
结果: