一、目录
1、题目:删除相邻为0、1的两个字符,得到最短长度
思路:
统计0和1的数量,然后将大的数量减去小的数量即可??
2、题目为:0-1数量相同的子串最长长度
给定一个数组,数组中只包含0和1。请找到一个最长的子序列,其中0和1的数量是相同的。
例1:10101010 结果就是其本身。
例2:1101000 结果是110100
例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))