aeiou和小巧思

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);
    }
};
posted @ 2026-03-11 23:06  Time_q  阅读(1)  评论(0)    收藏  举报