思路
主要方法是滑动窗口,求解恰好为K个辅音字母的符合条件的子数组,那么就可以转换成(至少为k个辅音字母的子数组数)-(至少为k+1个辅音字母的子数组),比如至少为2的数组有3个,至少为3的数组有2个,那么恰好为2的数组就只有一个,然后转换成至少的问题后就可以使用灵神的滑动窗口,固定右端点,枚举左端点,同时要满足有5个元音字母
代码
class Solution {
public:string s="aeiou";long long work(string &word,int k){ //work函数求解至少为k个辅音字母的子数组个数long long ans=0,l=0,cnt2=0;map<char,int>mp; //实时记录字符串中元音的个数for(auto b:word){ if(s.find(b)!=string::npos){ //判断当前的字符是不是元音,不是要记录辅音个数mp[b]++; }else cnt2++;while(mp.size()==5&&cnt2>=k){ //如果正好有5个元音并且辅音个数大于等于k,就可以开始枚举左端点了char x=word[l];if(s.find(x)!=string::npos){if(--mp[x]==0){mp.erase(x); //如果是元音字母就要从mp中移除}}else cnt2--; //如果是辅音就需要减少数量l++; }ans+=l; //最后l停止的地方就是能枚举出来的子数组的个数}return ans;}long long countOfSubstrings(string word, int k) {return work(word,k)-work(word,k+1); }
};