1393 0和1相等串
基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2
思路:01相等的子串会出现在前端、中端、或后端,这里中端和后端是一种情况。这里用了前缀和的思想。sum记录0、1个数的差值,符合题意的一定sum=0。如果出现在前端,那么从i=0遍历到sum=0,就是结果。如果出现在中端或后端,相等子串的开头前面那个位置和结尾的那个位置的sum一定是一样的,我们用map[sum]记录第一次出现的sum的下标,当sum相同时即出现了相同子串,更新最大长度。
#include<stdio.h>
#include<map>
#include<string.h>
#include<algorithm>
using namespace std;
char str[1000005];
map<int,int>m;
int main()
{
int maxn=0;
scanf("%s",str);
int len=strlen(str);
int sum=0;
for(int i=0;i<len;i++) {
if(str[i]=='1')
sum++;
else
sum--;
if(sum==0) maxn=i+1;//如果出现在前端,记录长度
if(m[sum]==0) {//记录第一次出现sum的下标
m[sum]=i;
}
else//出现相同的sum,中间一定为相等子串,取最大值
maxn=max(maxn,i-m[sum]);
}
printf("%d\n",maxn);
return 0;
}