题目描述
吕老师还有一个01串,串中只包含’0’和’1’,令x表示一个子串中0和1个数的差值的绝对值,吕老师想选出一个子串,使得该子串的x是所有子串中最大的(子串定义为串中任意个连续的字符组成的子序列)
输入
第一行输入一个01串S (1 ≤ |S| ≤ 100000),|S|代表串S的长度
输出
输出一个整数,代表吕老师选的子串的x的值
样例输入
00110111
样例输出
4
提示 我们可以选择后六位字符构成的子串"110111",这样这个子串的x值是4,是所有子串中最大的
#include <bits/stdc++.h>
using namespace std;
int main()
{
string str;
cin>>str;
//先假设0的个数大于1的个数时可以取得题目要求的最大值
int m=0;//m是0的个数减去1的个数的差值,即m=max(m0-m1)
int m0=0,m1=0;//m0是0的个数,m1是1的个数
for(int i=0;i<str.size();i++)//我们先假设m0-m1可以取得最大值,算出此时的m
{
if(str[i]=='0')
{
m0++;
m=max(m,m0-m1);
}
else
{
m1++;
if(m0-m1<=0)
{
m0=0;
m1=0;
}
}
}
//假设1的个数大于0的个数时可以取得题目要求的最大值
int n=0;
int n1=0,n0=0;
for(int i=0;i<str.size();i++)
{
if(str[i]=='1')
{
n1++;
n=max(n,n1-n0);
}
else
{
n0++;
if(n1-n0<=0)
{
n0=0;
n1=0;
}
}
}
cout<<max(m,n)<<endl;//输出两种情况的最大值
return 0;
}
如有问题,欢迎在评论区提问