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;
}


 

posted @ 2015-12-31 09:05  __NaCl  阅读(138)  评论(0编辑  收藏  举报