51nod 1393 0和1相等串 思路 : map存前缀和

题目:

思路:把'0'当成数字-1,'1'当成数字1,求前缀和,用map更新当前前缀和最早出现的位置。(用map而不用数组是因为可能会出现负数)

   当前缀和的值之前出现过,比如i = 10时,sum = 0;j = 50时,sum = 0; 更新ans = max(ans,j-i);

下面是一个例子:

代码:

#include <bitsstdc++.h>
using namespace std;

map<int,int> m; //存前缀和最早出现的位置 
int a[1000001]; //数字数组 
int main(){
    string s;
    cin >> s;
    
    //将字符串转换成数字数组 
    for (int i = 0; s[i]; ++i) {
        if (s[i] == '0') a[i + 1] = -1;
        else a[i + 1] = 1;
    }

    int ans = 0;  //最大长度 
    int sum = 0;  //前缀和 
    for (int i = 1; i <= s.length(); ++i) {
        sum += a[i];   //m[i]默认是为0的 (i为任意值)
        
        if (sum != 0 && m[sum] == 0) {  
            m[sum] = i; //之前未出现过相同值 
        }
        else {
            ans = max(ans, i - m[sum]); // 之前出现过相同值 
        }
    }

    cout << ans << endl;
    return 0;
} 
原文地址:https://www.cnblogs.com/zhangjiuding/p/7413461.html