📅  最后修改于: 2023-12-03 15:40:56.476000             🧑  作者: Mango
给定一个字符串数组,其中每个字符串由 A 和 B 组成,求由 A 0 和 B 1 组成的最长子集的长度。
暴力枚举。
从左到右枚举每一个字符,把它作为 0 或 1,然后用哈希表保存当前的前缀和,如果出现相同的前缀和,则说明这两个位置之间的子串的和为 0,可以更新最长子集的长度。
时间复杂度:$O(n^2)$。
前缀和 + 哈希表,优化解法一。
根据题目的特殊性质,我们发现如果子串和为 0,则它们对应的前缀和一定相同,因此我们可以用哈希表来快速判断是否出现过相同的前缀和。
时间复杂度:$O(n)$。
def findMaxLength(nums):
"""
:type nums: List[str]
:rtype: int
"""
n = len(nums)
res = 0
for i in range(n):
cnt0, cnt1 = 0, 0
for j in range(i, n):
if nums[j] == '0':
cnt0 += 1
else:
cnt1 += 1
if cnt0 == cnt1:
res = max(res, cnt0 + cnt1)
return res
def findMaxLength(nums):
"""
:type nums: List[str]
:rtype: int
"""
n = len(nums)
pre_sum = 0
mp = {0: -1}
res = 0
for i in range(n):
if nums[i] == '0':
pre_sum -= 1
else:
pre_sum += 1
if pre_sum in mp:
res = max(res, i - mp[pre_sum])
else:
mp[pre_sum] = i
return res
本题是一道比较典型的前缀和题目,如果理解了前缀和的概念及其应用,这道题目也并不复杂。需要注意的是,哈希表在此题目中的应用是一个比较巧妙的地方。