输入样例:
101011000
输出样例:
8
思路分析
前缀和求解,线性dp运用。
主要借助map哈希查找方式,不可使用两重的for循环,必超时。
当然借助unordered_map更快。
代码解析
#include<iostream>
#include<algorithm>
#include<cstring>
#include<map>
using namespace std;
int main()
{
string str;
int sum[100001] = { 0 }, val, len = 0;
map<int, int> mp;
while (cin >> str) {
len = 0;
mp[0] = 0;
for (int i = 0; i < str.size(); ++i) {
if (str[i] == '0')
val = -1;
else
val = 1;
sum[i + 1] += sum[i] + val;
if (mp.find(sum[i + 1]) == mp.end())
mp[sum[i + 1]] = i + 1;
}
for (int i = 1; i <= str.size(); ++i) {
if (mp.find(sum[i]) != mp.end()) {
if (mp[sum[i]] < i)
len = max(len, i - mp[sum[i]]);
}
}
cout << len << endl;
fill(sum, sum + str.size() + 1, 0);
mp.clear();
}
}