题目:
思路:把‘0‘当成数字-1,‘1‘当成数字1,求前缀和,用map更新当前前缀和最早出现的位置。(用map而不用数组是因为可能会出现负数)
当前缀和的值之前出现过,比如i = 10时,sum = 0;j = 50时,sum = 0; 更新ans = max(ans,j-i);
代码:
#include <bits\stdc++.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; }
时间: 2024-10-12 06:16:39