題目描述
給定只含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);
}
}