lc 3306. 元音辅音字符串计数 II
aeiou没必要一个一个敲
一个班级有10个人至少20岁,有3个人至少21岁,那么恰好20岁得人是多少?就是10-7,这题可以用这个思路来写,(灵神nb)
class Solution {
const string VOWEL = "aeiou";
//后面可以用VOWEL.find(x)!=string::npos
long long f(string& word, int k) {
long long ans = 0;
// 这里用哈希表实现,替换成数组会更快
unordered_map<char, int> cnt1; // 每种元音的个数
int cnt2 = 0; // 辅音个数
int left = 0;
for (char b : word) {
if (VOWEL.find(b) != string::npos) {
cnt1[b]++;
} else {
cnt2++;
}
while (cnt1.size() == 5 && cnt2 >= k) {
char out = word[left];
if (VOWEL.find(out) != string::npos) {
if (--cnt1[out] == 0) {
cnt1.erase(out);
}
} else {
cnt2--;
}
left++;
}
ans += left;//变成求至少有k个元音字符得子数组
//就跟前面子数组得写法是一样得
}
return ans;
}
//一个班级有10个人至少20岁,有3个人至少21岁,那么恰好20岁得就是10-3=7人,这道题也是这样写
public:
long long countOfSubstrings(string word, int k) {
return f(word, k) - f(word, k + 1);
}
};