0
点赞
收藏
分享

微信扫一扫

计算机考研复试之最长平衡串(c++)

输入样例:

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();
	}
}

运行结果

在这里插入图片描述

举报

相关推荐

0 条评论