最长01串(贪心)

一行一个整数,最长的0与1的个数相等的子串的长度。

1011
1111
1010

示例输出

2
0
4

思路:统计0与1的个数在串里相同且最大长度。可以见0就让ans--,1就++,当值为0的时候就比较一下当前的ma与i+1的大小

,但是有个问题就是当为000000000001111111111111(0的个数=1的个数)时会输出0,而不是20(假设1==0  位20个)。

#include<iostream>
#include<cstring>
#include<string>
#include<cstdio>
#include<algorithm>
#include<map>
#include<queue>
#include<cmath>
#define LL long long
#define inf 1000010
char s[inf];
int dp[inf*2+10];

using namespace std;
int main()
{
    int n,i,j;
    while(~scanf("%s",s))
    {
        memset(dp,-1,sizeof(dp));
        n=strlen(s);
        int ans=0,ma;
        ma=0;dp[inf]=0;
        for(i=0;i<n;i++)
        {
            if(s[i]=='1')
                ans++;
            else if(s[i]=='0')
                ans--;
            if(dp[ans+inf] == -1)
                dp[ans+inf] = i+1;
            else
                ma=max(ma,i+1-dp[ans+inf]);
        }
        printf("%d\n",ma);
    }
    return 0;
}

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

时间: 2024-10-14 11:17:40

最长01串(贪心)的相关文章

3308 最長01串 哈希

最长01串 Time Limit: 2666ms   Memory limit: 65536K  有疑问?点这里^_^ 题目描述 给定一个0-1串,请找到一个尽可能长的连续子串,其中包含的0与1的个数相等. 组数很多,注意常数优化... 输入 一个字符串,只包含01,长度不超过1000000 输出 一行一个整数,最长的0与1的个数相等的子串的长度. 示例输入 1011 1111 1010 示例输出 2 0 4 提示 为保证0和1的个数相等 并且最长, 可以通过和为0的方式进行处理. #inclu

【经典算法】寻找最长01字串(转自待字闺中)

这两天在微信公众号“待字闺中”中看到一个经典的面试算法,寻找最长01字串,原题目是这么说的: 给定一个数组,数组中只包含0和1.请找到一个最长的子序列,其中0和1的数量是相同的. 例1:10101010 结果就是其本身.例2:1101000 结果是110100 这个题目,看起来比较简单,一些同学可能认为题目的描述符合动态规划的特征,然后就开始用动态规划解,努力找状态转移方程.这些同学的感觉,是很正确的.但,找状态转移方程,我们要对原来的数组进行变换一下. 原来是0和1的串,我们将0都换为-1.这

51nod 1391 01串(DP)

题目链接题意:给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长子串长度.初步分析:假设子串S[i..j]是满足条件的一个最长子串,且i和j均不是边界(0<i && j<n-1),则S[i-1]一定是1,否则S[i-1, j]也满足条件且比S[i, j]长,矛盾.同理可推出S[j+1]是0.用类似的逻辑进一步可推出存在一个位置i<=x &

2014 UESTC Training for Data Structures J - 方师傅的01串

J - 方师傅的01串 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 方师傅过生日啦,于是蟹毛买了N个01串,想送给方师傅. 但是蟹毛觉得这些01串不够美,于是他想从中选出一些送给方师傅. 蟹毛对于p个01串的美值定义为: 这些01串的最长公共前缀的长度×p 所以蟹毛想从N个01串中选出一些,使得这些01串的美值最高. 请告诉蟹毛最好的美值是多少.

交错01串

如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串.例如: "1","10101","0101010"都是交错01串.小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串.小易需要你帮帮忙求出最长的这样的子串的长度是多少. 输入描述: 输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1' 输出描述: 输出一个整数,表示最长的满足要求的子串

51nod 1391 01串(锻炼思维的好题)

题目http://www.51nod.com/onlineJudge/questionCode.html#problemId=1391?iceId=20917 1391 01串 题目来源: Codility 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 给定一个01串S,求出它的一个尽可能长的子串S[i..j],满足存在一个位置i<=x <=j, S[i..x]中0比1多,而S[x + 1..j]中1比0多.求满足条件的最长子串长度. Input 一行包含

NYOJ-252 01串

01串 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 ACM的zyc在研究01串,他知道某一01串的长度,但他想知道不含有"11"子串的这种长度的01串共有多少个,他希望你能帮帮他. 注:01串的长度为2时,有3种:00,01,10. 输入 第一行有一个整数n(0<n<=100),表示有n组测试数据; 随后有n行,每行有一个整数m(2<=m<=40),表示01串的长度; 输出 输出不含有"11"子串的这种长度的

九章算法面试题34 最长01子串

九章算法官网-原文网址 http://www.jiuzhang.com/problem/34/ 题目 有一个仅有0和1组成的01串,找到其中最长的一段子串,使得该子串中0和1的数目相等 解答 如果将0看做-1,则我们要找的子串是最长的和为0的子串.这种子串求和的问题,一般采用前缀和的方法来解决.用Sum[i]代表前i个数的和,问题的模型转换为,找到i和j,满足Sum[i] 与Sum[j]相等,且|i-j|最大.使用Hash表作为辅助数据结构,Hash表中记录了获得某个Sum时最小的i.从左到右遍

[编程题] 交错01串 网易2018

如果一个01串任意两个相邻位置的字符都是不一样的,我们就叫这个01串为交错01串.例如: "1","10101","0101010"都是交错01串.小易现在有一个01串s,小易想找出一个最长的连续子串,并且这个子串是一个交错01串.小易需要你帮帮忙求出最长的这样的子串的长度是多少. 输入描述: 输入包括字符串s,s的长度length(1 ≤ length ≤ 50),字符串中只包含'0'和'1' 输出描述: 输出一个整数,表示最长的满足要求的子串