zoukankan      html  css  js  c++  java
  • 0-1字符串

    一、目录

    1、题目:删除相邻为0、1的两个字符,得到最短长度

     思路:

      统计0和1的数量,然后将大的数量减去小的数量即可??

    2、题目为:0-1数量相同的子串最长长度

    给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的。
    例1:10101010 结果就是其本身。
    例2:1101000 结果是110100

    升级题目:

    若此不仅只有0和1  还有其他数  求0和1数目相等的最大子数组的长度

     【可以将0变为-1  其他数字变为0  还是成了求累加和为0的题了】

      思路1:

    定义一个数据B[N], B[i]表示从A[0...i]中 num_of_0 - num_of_1,0的个数与1的个数的差

          那么如果A[i] ~ A[j]是符合条件的子串,一定有 B[i] == B[j],因为中间的部分0、1个数相等,相减等于0。 只需要扫一遍A[N]就能把B[N]构造出来了。

          这样问题就转换成了求 距离最远的一对数,使得B[i] == B[j],因为B[i]的范围一定是[-N,N],-N到N的范围都存起来,这样每扫到B[i],查数就行了。

    思路2:也就是思路1

      原来是0和1的串,我们将0都换为-1。这样题目目标就变成,找到一个最长的子串,子串数字和是0。设原数组为A, DP[i]表示从0开始到i的子数组和。DP遍历一遍数组即可。例1中的数组产生的DP为:  

      

    代码:

    from collections import defaultdict
    def minLen(arr):
        dp = [0] * len(arr)
        dp[0] = 1 if arr[0] == '1' else -1
        for i in range(1, len(arr)):
            if arr[i] == '0':
                dp[i] = dp[i - 1] - 1
            else:
                dp[i] = dp[i - 1] + 1
        res = 0
        dic = defaultdict(list)
        for i in range(len(dp)):
            if dp[i] == 0:
                res = max(res, i + 1)
            dic[dp[i]].append(i)
        for k, v in dic.items():
            res = max(res, max(v) - min(v))
        return res
    
    
    # n = int(input())
    # s = input()
    n = 4
    s = '1100'
    print(minLen(s))

     

      

  • 相关阅读:
    Oracle创建database link(dblink)和同义词(synonym)
    spring boot 集成 quartz 定时任务
    tomcat 启动Spring boot 项目
    UUID+随机数
    js常用字符串处理方法
    Win10安装mysql-8.0.11-winx64详细步骤
    ORA-02049: 超时: 分布式事务处理等待锁
    spring boot 发邮件
    bootstrap table 列求和
    spring boot 延长 Session 时间
  • 原文地址:https://www.cnblogs.com/Lee-yl/p/10660505.html
Copyright © 2011-2022 走看看