【计数二进制子串】计数
2020年8月10日 10:00
思路
- 对于
000111来说,符合要求的子串是000111001101- 不难发现,如果我们找到一段类似
000111的数据,就可以用来统计答案 - 即 这样前面是连续
0/1后面是连续1/0的数据 - 这一段的所有 3 个子串,取决于前面
0/1的个数和后面1/0的个数 - 即
min(cnt_pre, cnt_cur)
- 不难发现,如果我们找到一段类似
![]()
- 遍历时,当数字再一次改变时(或到达结尾时),意味着一段结束,并能得到这一段前面和后面数字的个数。
- 如
11101来说,当我们遍历到最后的1时,1110就是一段可以用来统计答案的数据 - 而末尾的
01则是另一段可以用来统计答案的数据
- 如
<
,
>
- 小技巧,对字符串结尾增加一个字符,可以将判断逻辑写在一个地方
答题
class Solution {
public:
int countBinarySubstrings(string s) {
int ans = 0;
char last = '-';
int cnt_pre = 0;
int cnt_cur = 0;
s += '-';
for (auto c : s) {
if (last != c) {
last = c;
ans += min(cnt_pre, cnt_cur);
cnt_pre = cnt_cur;
cnt_cur = 0;
}
cnt_cur++;
}
return ans;
}
};
致谢
感谢您的观看,如果感觉还不错就点个赞吧,关注我的 力扣个人主页 ,欢迎热烈的交流!