题目链接:点击打开链接
找出最长的平衡01串长度。
思路,遇见一个1,sum++,遇见0,sum--;记录每一个的sum的位置,,dis[sum]=i;
初始的时候把dis全部初始化为-1,如果当前dis[sum]=-1证明这个sum第一次出现,记录其出现的位置。
如果当前did[sum]!=-1,那么证明这个sum,之前出现过,那么从之前那个位置到现在这个位置,中间的和为0,sum+0=sum 证明中间是一部分平衡01串,然后一直更新,最后的结果就是最长的平衡01串。
类似组合数学中做鸽巢定理一道题的思路。:)
因为有负数的存在,所以每个sum+1e5 代码参考http://blog.csdn.net/zhang_di233/article/details/48108347
简述题目:给出一串字符串,只包含A,B两种字符,找出最长的一段平衡字符串,平衡字符串即为A,B字符出现的次数相等。
思路如上。
ACcode:
/*
2017年10月13日19点22分
AC
处理字符串的方法
*/
#include <iostream>
#include <map>
#include <set>
#include <string>
#include<string.h>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <queue>
#include <vector>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int dis[maxn];
int sum=0;
int main(){
int n;
scanf("%d",&n);
string s;
cin>>s;
int ans=0;
memset(dis,-1,sizeof(dis));
for(int i=0;i<n;i++){
if(s[i]=='1') sum++;
else if(s[i]=='0') sum--;
if(sum==0){
ans=max(ans,i+1);
continue;
}
if(dis[sum+100000]==-1){
dis[sum+100000]=i;
}else{
ans=max(ans,i-dis[sum+100000]);
}
}
printf("%d\n",ans);
return 0;
}