题意:给你一个字符串,找出最长的平衡子字符串。
思路:因为只有01两个元素,所以将 0 看成-1,前缀和记录每个位置的当前价值,如果是1价值加一,如果是0价值减1,最后迭代相同价值的位置,维护一个最远距离。map 辅助。注意最后维护时不要漏掉一开始为0的情况,所以要从i = 0开始判断。
#include <bits/stdc++.h>
using namespace std;
char a[100005];
map<int,int>mp;
int sum[100005];
int main()
{
int n ;
cin >> n;
sum[0] = 0;
for(int i = 1; i <= n; i++)
{
cin >> a[i];
sum[i] = sum[i - 1];
if(a[i] == '0')
sum[i] -= 1;
else sum[i]++;
}
int maxn = 0;
for(int i = 0;i <= n;i++)
{
if(mp.count(sum[i]))
{
maxn = max(maxn,abs(i - mp[sum[i]]));
}
else
{
mp[sum[i]] = i;
}
}
cout << maxn << endl;
return 0;
}