力扣2953.统计完全子字符串
-
先分组循环求出每个组 分别算个数
- 对于每个组 枚举一遍其中有多少种字母
- 用cnt数组记录每个字母出现次数 check的时候也是暴力枚举cnt中每个字母出现次数
-
**分组循环:**从i(新一组的起点)开始,当满足条件时++,最后退出循环时一定是到了下一个组的起点然后继续循环
-
**Lambda表达式:**auto check = [&](){...}可以调用/修改外部作用域的变量
-
如本题用check就是调用外部的cnt数组
-
string_view:就是用新的变量名表示原字符串
-
但是不会调用拷贝 是"共享"的
cpp
class Solution {
int f(string_view s,int k)
{
int res=0;
for(int m=1;m<=26 && k * m <= s.size();m++)
{
int cnt[26]{};
auto check = &{
for(int i=0;i<26;i++)
if(cnt[i] && cnt[i] != k) return ;
res++;
};
for(int right=0;right<s.size();right++)
{
cnt[s[right] - 'a'] ++;
int left = right + 1 - k*m;
if(left >= 0)
{
check();
cnt[s[left] - 'a'] --;
}
}
}
return res;
}
public:
int countCompleteSubstrings(string word, int k) {
int n = word.size();
int ans = 0;
string_view s(word);
for(int i=0;i<n;)
{
int st = i;
for(i++;i<n && abs((int)word[i] - (int)word[i-1]) <= 2;i++);
ans += f(s.substr(st,i-st),k);
}
return ans;
}
};