public static int[] platesBetweenCandles(String s, int[][] queries) {
int n = s.length();
//sum前缀和数组用来快速求解
int[] sums = new int[n];
//last数组是为了找到大于等于当前位置的 | 的位置,因为要用前缀和数组求解,所以需要知道start之后的第一个|位置
//在求解sum数组的时候就是按照 end位置的前一个 | 的位置求出来的前缀和数组,所以end不需要处理
int[] last = new int[n];
int pre = 0;
//找到第一个 | 位置
for (int i = 0; i < n; i++) {
if (s.charAt(i) == '|') {
pre = i;
//这里需要把 | 位置的last[pre] 设置成自己,
last[i] = i;
break;
}
last[i] = 0;
}
//求解sum数组
for (int i = pre+1; i < n; i++) {
if (s.charAt(i) == '|') {
//求解个数
sums[i] = sums[i - 1] + i - 1 - pre;
//设置pre+1 ---> 当前位置 的last设置成当前位置,因为从pre+1 到当前位置作为start的时候因为没| 所以就和从当前位置开始是一样的
for (int j = pre+1; j <= i; j++) {
last[j] = i;
}
//重置pre数值
pre = i;
} else {
//sum数组更新,没碰到 | 就和上一个一样
sums[i] = sums[i - 1];
}
}
//因为最后可能后面几个 * 最后一个没有 | 要设置成 n或者比n大的数,后面在 - 的时候就会默认设置成0了
for (int i = pre; i < n; i++) {
last[i] = n;
}
int[] res = new int[queries.length];
for (int i = 0; i < queries.length; i++) {
//如果start 的后面一个 | 位置比end大,那就没必要算了,没有,设置成0
if (last[queries[i][0]] >= queries[i][1]) {
res[i] = 0;
} else {
//比end小,可以一算
res[i] = sums[queries[i][1]] - sums[last[queries[i][0]]];
}
}
return res;
}