题目
方法一:双指针
分析
i为左边界,j为右边界。
从i开始,如果 [i,j] 符合条件,那么[i,j+1]也符合条件。
怎样判断当前窗口是否符合条件?对 abc 分别计数,每一个字符串都去遍历每个字符来计数的话太慢了,我们需要充分利用移动窗口前的计数信息,在之前的基础上相应的计数+1/-1。
代码
class Solution {
public int numberOfSubstrings(String s) {
int len=s.length();
int i=0,j=0;
int[] count=new int[3];
int res=0;
while(i<=j&&j<len){
//如果还没形成窗口
while((!(count[0]>0&&count[1]>0&&count[2]>0))&&j<len){
char c=s.charAt(j);
count[c-'a']++;
j++;
}
while((count[0]>0&&count[1]>0&&count[2]>0)&&i<len){
res+=(len-j+1);
char c=s.charAt(i);
count[c-'a']--;
i++;
}
}
return res;
}
}
复杂度
时间复杂度:两个指针各移动了 n 次,所以时间复杂度为O(n)
空间复杂度:只需要常数的空间记录当前三个字符的出现次数,所以空间复杂度为 O(1) 。