很不错的计数问题,用到了分组循环技巧和滑动窗口 代码的实现方式也非常值得多看
cpp
class Solution {
public:
int f(string s,int k){
int res = 0;
for(int m=1;m<=26&&k*m<=s.size();++m){
int cnt[27]{};
auto check=[&](){
for(int i=0;i<=26;++i){
if(cnt[i]&&cnt[i]!=k)return;
}
res++;
};
for(int r=0;r<s.size();++r){
cnt[s[r]-'a']++;
int l = r+1-k*m;
if(l>=0){
check();
cnt[s[l]-'a']--;
}
}
}
return res;
}
int countCompleteSubstrings(string word, int k) {
int n = word.size();
int res = 0;
for(int i=0;i<n;){
int start = i;
++i;
while(i<n&&abs(int(word[i]-word[i-1]))<=2)++i;
res+=f(word.substr(start,i-start),k);
}
return res;
}
};