给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。

http://www.51nod.com/onlineJudge/questionCode.html#!problemId=1393

这题解法很奇妙。也是看了别人的思路才想出来.

首先考虑把0全部变成-1。然后统计一个前缀和,用sum[i]表示.

那么从起点开始的子串是合法的只要sum[i]的值等于0即可.

如果子串起点不为0,那么只要两次出现sum[i],这两个数值之间一定是合法的子串.

例如:

标号:   1  2  3  4  5

数值      0  0  1  1  0

sum     -1 -2 -1 0  -1

i==4的时候sum[i]==0,所以1-4之间是一个合法的子串,长度为4

sum[1]==sum[3]==sum[5]== -1,所以 (1,3],(1,5],(3,5]之间都是合法的子串,取最大值也是4.

我是用了map,其实不用这么麻烦,只要用一个变量就可以代替sum数组,并且另外开一个标记数组可以代替map做映射.

 1 #include <iostream>
 2 #include <string.h>
 3 #include <stdio.h>
 4 #include <map>
 5 using namespace std;
 6 char s[1000010];
 7 int t[1000010],sum[1000010];
 8 int main()
 9 {
10     //freopen("a.txt","r",stdin);
11     scanf("%s",s+1);
12     int l=strlen(s+1);
13     for(int i=1;i<=l;i++)
14         if(s[i]==‘0‘) t[i]=-1;
15         else t[i]=1;
16     //for(int i=0;i<l;i++) printf("%d",t[i]);
17     sum[1]=t[1];
18     map<int,int>m;
19     m[sum[1]]=1;
20     int maxn=0;
21     for(int i=2;i<=l;i++)
22     {
23         sum[i]=sum[i-1]+t[i];
24         //printf("%d\n",sum[i]);
25         if(m[sum[i]]!=0) maxn=max(maxn,i-m[sum[i]]);
26         else m[sum[i]]=i;
27         if(sum[i]==0) maxn=max(maxn,i);
28     }
29     printf("%d\n",maxn);
30     return 0;
31 }
时间: 2024-10-28 22:09:29

给定一个0-1串,请找到一个尽可能长的子串,其中包含的0与1的个数相等。的相关文章

poj 1226 hdu 1238 Substrings 求若干字符串正串及反串的最长公共子串 2002亚洲赛天津预选题

题目:http://poj.org/problem?id=1226 http://acm.hdu.edu.cn/showproblem.php?pid=1238 其实用hash+lcp可能也可以,甚至可能写起来更快,不过我没试,我最近在练习后缀数组,所以来练手 后缀数组的典型用法之一----------------后缀数组+lcp+二分 思路:1.首先将所有的字符串每读取一个,就将其反转,作为一组,假设其下标为i到j,那么cnt[i]到cnt[j]都标记为一个数字(这个数字意思是第几个读入的字符

给定一个整数数组 nums ,找到一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

示例: 输入: [-2,1,-3,4,-1,2,1,-5,4], 输出: 6 解释: 连续子数组 [4,-1,2,1] 的和最大,为 6. 1 class Solution { 2 public int maxSubArray(int[] nums) { 3 int sum=nums[0];//当前遍历到的最大和的子集 4 int max=nums[0];//数组的最大和 5 for(int i=1;i<nums.length;i++){ 6 sum=sum>0?(sum+nums[i]):n

一道笔试题-给定一个正整数序列,请尝试将它们重新排列使得排列的结果最大。

问题描述:给定一个正整数序列,请尝试将它们重新排列使得排列的结果最大,例如正整数序列为9,31,35,3,7则最大值为9735331. 思路分析:先将正整数序列转换为字符串数组,然后字符串数组进行排序,最后依次输出字符串数组即可.根据题目的要求,两个数字m和n排成的数字mn和nm,如果mn<nm,那么我们应该输出nm,也就是m应该排在n的后面,也就是m<n.反之,如果nm<mn,m排在n的前面,n<m.如果mn==mn,m等于n. 比较函数的定义是本解决方案的关键.这道题其实就是希

61. 从1到n,共有n个数字,每个数字只出现一次。从中随机拿走一个数字x,请给出最快的方法,找到这个数字。如果随机拿走k(k&gt;=2)个数字呢?[find k missing numbers from 1 to n]

[本文链接] http://www.cnblogs.com/hellogiser/p/find-k-missing-numbers-from-1-to-n.html  [题目] 从1到n,共有n个数字(无序排列),每个数字只出现一次.现在随机拿走一个数字x,请给出最快的方法,找到这个数字.要求时间复杂度为O(n),空间复杂度为O(1).如果随机拿走k(k>=2)个数字呢? [分析] 题目给出的条件很强,数字是从1~n的数字,限制了数字的范围:每个数字只出现一次,限制了数字出现的次数:随即拿走了一

通过键盘输入一串小写字母(a~z)组成的字符串。请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉。 比如字符串“abacacde”过滤结果为“abcde”。

这是华为2013的一个机试题,会好半天才想出来,用了三个for循环,可能有点繁琐,但只要慢慢看还是好理解的, 题目: 通过键盘输入一串小写字母(a~z)组成的字符串.请编写一个字符串过滤程序,若字符串中出现多个相同的字符,将非首次出现的字符过滤掉. 比如字符串"abacacde"过滤结果为"abcde". #include<stdio.h> #include<string.h> void main() { char a[]="aba

Given a string, find the length of the longest substring without repeating characters.(给定一个字符串,找到最长的子串的长度,这个子串不存在重复的字符。 )

Given a string, find the length of the longest substring without repeating characters. Examples: Given "abcabcbb", the answer is "abc", which the length is 3. Given "bbbbb", the answer is "b", with the length of 1.

刷题之给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数

今天下午,看了一会github,想刷个题呢,就翻出来了刷点题提高自己的实际中的解决问题的能力,在面试的过程中,我们发现,其实很多时候,面试官 给我们的题,其实也是有一定的随机性的,所以我们要多刷更多的题.去发现问题. 题目:     给定一个整数数组 nums 和一个目标值 taget,请你在该数组中找出和为目标值的那 两个 整数,并返回他们的数组下标. 你可以假设每种输入只会对应一个答案.但是,你不能重复利用这个数组中同样的元素. 解析: 实际这里就是给你的一个列表的数字,给你一个预期,让你返

给出一个区间[a, b],计算区间内“神奇数”的个数。 神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数。 比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数。同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数。

给出一个区间[a, b],计算区间内"神奇数"的个数.神奇数的定义:存在不同位置的两个数位,组成一个两位数(且不含前导0),且这个两位数为质数.比如:153,可以使用数字3和数字1组成13,13是质数,满足神奇数.同样153可以找到31和53也为质数,只要找到一个质数即满足神奇数. 输入描述: 输入为两个整数a和b,代表[a, b]区间 (1 ≤ a ≤ b ≤ 10000). 输出描述: 输出为一个整数,表示区间内满足条件的整数个数 输入例子: 11 20 输出例子: 6 1 #in

语义分割(semantic segmentation) 常用神经网络介绍对比-FCN SegNet U-net DeconvNet,语义分割,简单来说就是给定一张图片,对图片中的每一个像素点进行分类;目标检测只有两类,目标和非目标,就是在一张图片中找到并用box标注出所有的目标.

from:https://blog.csdn.net/u012931582/article/details/70314859 2017年04月21日 14:54:10 阅读数:4369 前言 在这里,先介绍几个概念,也是图像处理当中的最常见任务. 语义分割(semantic segmentation) 目标检测(object detection) 目标识别(object recognition) 实例分割(instance segmentation) 语义分割 首先需要了解一下什么是语义分割(s