题目
思路
前缀和
首先按照次序将盘子的前缀和列表计算出来
然后计算得到每一个元素左边离它最近的蜡烛的列表lefts,每一个元素右边离它最近的蜡烛的列表rights
对于每一个子字符串,结果等于离最右边元素最近的左侧的蜡烛的前缀和减去离最左边元素最近的右侧蜡烛的前缀和。
注意,为了方便前缀和计算,列表长度为字符串长度加1,所以最后计算前缀和时对应下标要加1
Python3代码
def platesBetweenCandles(self, s: str, queries: List[List[int]]) -> List[int]:
n = len(s)
presum, lefts, rights, l, r, res = [0] * (n + 1), [-1] * n, [-1] * n, -1, -1, []
for i, c in enumerate(s):
presum[i + 1] = presum[i]
if c == '*': presum[i + 1] += 1
else: l = i
lefts[i] = l
for i, c in enumerate(s[::-1]):
if c == '|': r = n - 1 - i
rights[n - 1 - i] = r
for l, r in queries:
# 因为前缀和列表长度等于原始字符串长度加1,对应下标加1
if rights[l] >= 0 and lefts[r] >= 0 and rights[l] < lefts[r]: res.append(presum[lefts[r] + 1] - presum[rights[l] + 1])
else: res.append(0)
return res