题目描述
给定只含01的字符串,找出最长平衡子串的长度(平衡串:包含0和1的个数相同),串长最大10^6
输入
一个字符串,只包含01,长度不超过1000000
输出
一行一个整数,最长的0与1的个数相等的子串的长度。
示例输入
3
1011
1111
1010
示例输出
2
0
4
思路:将0看做-1,求前i项和,当前i项和为0时,以此元素为结尾的最长长度为当前下标值+1;若该和值是第一次出现用hash数组记录该和值第一次出现时的下标i,否则当前下标值与hash数组中记录的当前和值第一次的下标值相减就是以此元素为结尾的最长长度。其中的最长的长度便是所要求的解。
实现代码:
#include<bits/stdc++.h>
using namespace std;
char s[1000003];
int h[2000003];
int main()
{
int t,i,j;
int m=1000001;//作为和值偏移值 防止出现负数无法用hash数组保存
scanf("%d",&t);
while(t--)
{
memset(h,-1,sizeof(h));
scanf("%s",&s);
int n=0,ma=0;
for(i=0;i<strlen(s);i++)
{
if(s[i]=='0')n--;
else n++;
if(n==0)ma=max(ma,i+1);
else if(h[n+m]==-1)h[n+m]=i;
else {
ma=max(ma,i-h[n+m]);
}
}
printf("%d\n",ma);
}
}