Balanced Substring 前缀和 思维寻找平衡串

题意:给你一个字符串,找出最长的平衡子字符串。
思路:因为只有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;
}

发布了244 篇原创文章 · 获赞 8 · 访问量 5122

猜你喜欢

转载自blog.csdn.net/weixin_43960370/article/details/103019914