基准时间限制:1 秒 空间限制:131072 KB 分值: 20 难度:3级算法题
 收藏
 关注
给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。
Input
一个字符串,只包含01,长度不超过1000000。
Output
一行一个整数,最长的0与1的个数相等的子串的长度。
Input示例
1011
Output示例
2

记录每一个字符时所含有的1个个数与0的个数,一个字串包含的0和1的个数相等,就是首尾处1的个数与0的个数的差值相等。所以对于每一个字符,看之前这个差值有没有相同的,有相同的就取看能否够得着最大值。没有则标记一下。O(n)。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <string>
#include <cstring>
#pragma warning(disable:4996)
using namespace std; int sum0[1000000];
int sum1[1000000];
int diff[1000000]; int main()
{
memset(diff, -1, sizeof(diff));
string test;
cin >> test; int i, max_v = 0;
int len = test.length(); sum0[0] = 0;
sum1[0] = 0; if (test[0] == '0')
{
sum0[i] = 1;
sum1[i] = 0;
}
else
{
sum1[i] = 1;
sum0[i] = 0;
} for (i = 1; i < len; i++)
{
if (test[i] == '0')
{
sum0[i] = sum0[i - 1] + 1;
sum1[i] = sum1[i - 1];
}
else
{
sum1[i] = sum1[i - 1] + 1;
sum0[i] = sum0[i - 1];
}
if (diff[sum1[i] - sum0[i] + 500000] == -1)
{
diff[sum1[i] - sum0[i] + 500000] = i;
}
else
{
max_v = max(max_v, i - diff[sum1[i] - sum0[i] + 500000]);
}
if (sum1[i] == sum0[i])
{
max_v = max(max_v, i + 1);
}
}
cout << max_v << endl; return 0;
}

版权声明:本文为博主原创文章,未经博主允许不得转载。

最新文章

  1. Swift-UIButton
  2. CI-持续集成(1)-软件工业“流水线”概述
  3. iPhone Push消息全攻略.1
  4. maven工程-eclipse红叹号
  5. scala 入门(2)--数组相关操作
  6. Android中的菜单
  7. 辛星跟您玩转vim第一节之vim的下载与三种模式
  8. Scheme N皇后
  9. 如何解决Mac无法读取外置硬盘问题?
  10. SLAM+语音机器人DIY系列:(八)高阶拓展——1.miiboo机器人安卓手机APP开发
  11. springboot 学习之路 4(日志输出)
  12. oracle随机数(转)
  13. Linux 磁盘使用查看 查看使用磁盘程序 Monitoring disk activity in linux
  14. 一些做vue前端的经验
  15. 安装最新nginx
  16. 【Android】Android实现Handler异步详解
  17. 新概念 Lesson 3 Nice to meet you
  18. Openwrt VLAN Configure(2)
  19. R语言爬虫:使用R语言爬取豆瓣电影数据
  20. 深入理解JAVA I/O系列四:RandomAccessFile

热门文章

  1. SimpleAuthenticationInfo
  2. STM32CubeIDE 编译C/C++程序
  3. 微信小程序IOS真机调试发生了SSL 错误,无法建立与该服务器的安全连接
  4. js的执行和调试
  5. 008.Oracle数据库 , 判断字段内容是否为空
  6. 基于Hadoop3.1.2集群的Hive3.1.2安装(有不少坑)
  7. Day 28:SAX解析原理
  8. Day 23:JAVA SE复习
  9. 中兴获25个5G商用合同
  10. 索尼研发的新主机竟兼容现款PSVR!