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))

 

  

猜你喜欢

转载自www.cnblogs.com/Lee-yl/p/10660505.html