Medium
There is a long table with a line of plates and candles arranged on top of it. You are given a 0-indexed string s
consisting of characters '*'
and '|'
only, where a '*'
represents a plate and a '|'
represents a candle.
You are also given a 0-indexed 2D integer array queries
where queries[i] = [lefti, righti]
denotes the substring s[lefti...righti]
(inclusive). For each query, you need to find the number of plates between candles that are in the substring. A plate is considered between candles if there is at least one candle to its left and at least one candle to its right in the substring.
s = "||**||**|*"
, and a query [3, 8]
denotes the substring "*||******|"
. The number of plates between candles in this substring is 2
, as each of the two plates has at least one candle in the substring to its left and right.Return an integer array answer
where answer[i]
is the answer to the ith
query.
Example 1:
Input: s = “**|**|***|”, queries = [[2,5],[5,9]]
Output: [2,3]
Explanation: - queries[0] has two plates between candles. - queries[1] has three plates between candles.
Example 2:
Input: s = “***|**|*****|**||**|*”, queries = [[1,17],[4,5],[14,17],[5,11],[15,16]]
Output: [9,0,0,0,0]
Explanation: - queries[0] has nine plates between candles. - The other queries have zero plates between candles.
Constraints:
3 <= s.length <= 105
s
consists of '*'
and '|'
characters.1 <= queries.length <= 105
queries[i].length == 2
0 <= lefti <= righti < s.length
public class Solution {
public int[] platesBetweenCandles(String s, int[][] queries) {
char[] sa = s.toCharArray();
int n = sa.length;
int[] nextCandle = new int[n + 1];
nextCandle[n] = -1;
for (int i = n - 1; i >= 0; i--) {
nextCandle[i] = sa[i] == '|' ? i : nextCandle[i + 1];
}
int[] prevCandle = new int[n];
int[] prevPlates = new int[n];
int countPlate = 0;
if (sa[0] == '*') {
countPlate = 1;
prevCandle[0] = -1;
}
for (int i = 1; i < n; i++) {
if (sa[i] == '|') {
prevCandle[i] = i;
prevPlates[i] = countPlate;
} else {
prevCandle[i] = prevCandle[i - 1];
countPlate++;
}
}
int len = queries.length;
int[] res = new int[len];
for (int i = 0; i < len; i++) {
int[] query = queries[i];
int start = query[0];
int end = query[1];
int curPlates = 0;
int endCandle = prevCandle[end];
if (endCandle >= start) {
int startCandle = nextCandle[start];
curPlates = prevPlates[endCandle] - prevPlates[startCandle];
}
res[i] = curPlates;
}
return res;
}
}