class Solution:
def findLongestSubarray(self, array: List[str]) -> List[str]:
# 两个前缀和为0的时候/两个前缀和相同的时候
n = len(array)
# 并用一个映射(字典)dic来记录前缀和的值和它的最左边的下标位置;
dic = {}
prefix = [0]*n
# 记录数组长度
left = 0
right = 0
# 初始化字母为1,数字为-1
for i in range(n):
ch = array[i]
if 'A'<=ch<='z':
prefix[i] = -1
else:
prefix[i] = 1
# 计算前缀和
for i in range(1,n):
prefix[i] += prefix[i-1]
# 在数组中找前缀和相同的元素,以及前缀和为0的元素
for i in range(len(prefix)):
if prefix[i]==0:
# 因为前缀和为0的情况,就是从数组头,到当前位置的数组切片
if right-left < i:
left = 0
right = i + 1
else:
# 判断前缀和是否出现过
if prefix[i] in dic:
if right - left < i - dic[prefix[i]]:
left = dic[prefix[i]] + 1
right = i + 1
else:
dic[prefix[i]] = i
return array[left: right]
每日一道Leetcode - 面试题 17.05. 字母与数字[前缀和系列|动态规划]
最新推荐文章于 2024-07-25 00:08:05 发布