使用了前缀和的知识,但除了前缀和之外,我觉得还有一处地方非常巧妙:用left数组和right数组存放蜡烛的位置,还使用了临时变量l作为过渡,如果查询的一侧没有蜡烛那么数组对应位置就是-1,使得查询蜡烛位置非常的方便!
class Solution {
public:
vector<int> platesBetweenCandles(string s, vector<vector<int>>& queries) {
int n = s.size();
vector<int> preSum(n);
vector<int> ans;
for(int i=0, sum=0; i<n; ++i){
if(s[i]=='*'){
++sum;
}
preSum[i] = sum;
}
vector<int> left(n);
vector<int> right(n);
int l=-1;
for(int i=0; i<n; ++i){
if(s[i]=='|'){
l=i;
}
left[i] = l;
}
for(int i=n-1; i>=0; --i){
if(s[i]=='|'){
l=i;
}
right[i] = l;
}
for(auto& query: queries){
int x=right[query[0]];
int y=left[query[1]];
ans.push_back(x==-1||y==-1||x>=y? 0: preSum[y]-preSum[x]);
}
return ans;
}
};