01相等的字串。
给出一个只有01的字符串,请找出最长的的01的数目的相等的字串。。
这题最暴力的解决方法就是就是先预处理每个区间01的数目,然后枚举起点和重点,时间复杂度是O(N^2)。
下面我们来介绍一种O(n)时间复杂度的做法。。。
首先我们可以用一个数组B[i]把串A当中A[0...i]中1和0的差存起来。这样我们能发现符合要求的就是串满足B[i]==B[j].题目要要最最长,然后找到i-j跨度最大的即可。
#include<stdio.h>
#include<string.h>
#include<math.h>
const int N=2000000;
char s[N];
int count[2];
int B[N];
int num[N];
int main()
{
while(scanf("%s",s)!=EOF)
{
int n=strlen(s);
int i;
count[0]=0;
count[1]=0;
memset(B,0,sizeof(B));
memset(num,-1,sizeof(num));
int tmp=0,ans=0;
for(i=0;i<n;i++)
{
if(s[i]=='1')
count[1]++;
else
count[0]++;
B[i]=count[1]-count[0];
if(num[B[i]+n]==-1&&B[i]!=0)
num[B[i]+n]=i;
else
{
tmp=i-num[B[i]+n];
if(tmp>ans)
ans=tmp;
}
}
printf("%d\n",ans);
}
return 0;
}