力扣2953.統計完全子字符串
-
先分組循環求出每個組 分別算個數
- 對于每個組 枚舉一遍其中有多少種字母
- 用cnt數組記錄每個字母出現次數 check的時候也是暴力枚舉cnt中每個字母出現次數
-
**分組循環:**從i(新一組的起點)開始,當滿足條件時++,最后退出循環時一定是到了下一個組的起點然后繼續循環
-
**Lambda表達式:**auto check = [&](){…}可以調用/修改外部作用域的變量
-
如本題用check就是調用外部的cnt數組
-
string_view:就是用新的變量名表示原字符串
-
但是不會調用拷貝 是“共享”的
-
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;
}
};
?