题目:
![](https://i-blog.csdnimg.cn/blog_migrate/c04e911875565f34ed58766a65431d14.png)
方法:
首先考虑如何计算具有相同数量的0和1,可以通过将0转换为-1,若长度n的元素之和为0,则说明n个元素中的0与1的个数相等。若前n个元素之和等于前n+j个元素之和,则n到n+j个元素中的0与1个数相等。
可以通过2*nums[i] -1的方法,将nums中的0转换为1。
接下来创建一个dict,键值为元素累加求和,value为最后一个累加元素的角标
遍历的同时,当前元素与dict中键值相同元素(前n项和相同元素)的最大差值,也就是当出现也就是0,1个数相等子串的最长长度。
最后返回最大的长度值。
有一点需要说明就是dict1中初始设置{0:-1},是因为list的下标从0开始,故前0个元素的和为0,下标为-1。
class Solution:
def findMaxLength(self, nums):
"""
:type nums: List[int]
:rtype: int
"""
dmap = {0 : -1}
res = total = 0
for i, n in enumerate(nums):
total += 2 * nums[i] - 1
if total in dmap:
res = max(res, i - dmap[total])
else:
dmap[total] = i
return res