给你一个仅由 0 和 1 组成的二进制字符串 s 。
如果子字符串中所有的 0 都在 1 之前且其中 0 的数量等于 1 的数量,则认为 s 的这个子字符串是平衡子字符串。
请注意,空子字符串也视作平衡子字符串。 返回 s 中最长的平衡子字符串长度。子字符串是字符串中的一个连续字符序列。
输入:s = “01000111”
输出:6
解释:最长的平衡子字符串是 “000111” ,长度为 6 。
输入:s = “00111”
输出:4
解释:最长的平衡子字符串是 “0011” ,长度为 4 。
输入:s = “111”
输出:0
解释:除了空子字符串之外不存在其他平衡子字符串,所以答案为 0 。
#include <iostream>
#include <string>
#include <cmath>
using namespace std;
int main(){
string str;
getline(cin, str);
int ans = 0;
int left; // 记录 0 的个数
int right; // 记录 1 的个数
for(int i = 0; i < str.size(); ++i){
if(str[i] == '0'){
int j = i; // 遇到 0 开始计数
left = right = 0;
while(j < str.size() && str[j] == '0'){
left++; // 先统计 0 的个数
j++;
}
while(j < str.size() && str[j] == '1'){
right++; // 再统计 1 的个数
j++;
if(right == left){
ans = max(ans, right*2);
}
}
}
}
cout << ans << endl;
return 0;
}
这段代码中的循环遍历了字符串中的每一个字符,如果当前字符是 ‘0’,就从这个字符开始向后遍历,统计连续的 ‘0’ 的个数,当遇到一个 ‘1’ 时,就从这个字符开始向后遍历,统计连续的 ‘1’ 的个数,直到遇到一个 ‘0’ 或者到达字符串末尾为止。
如果此时 ‘1’ 的个数和 ‘0’ 的个数相等,说明找到了一个符合条件的连续子串,就计算该子串中 ‘0’ 和 ‘1’ 的个数之和,并将这个值与之前找到的符合条件的子串的个数相比较,保留较大的那个值。