(nice!!!)(LeetCode 每日一题)3306. 元音辅音字符串计数 II(哈希表、滑动窗口)

题目:3306. 元音辅音字符串计数 II

(nice!!!)(LeetCode 每日一题)3306. 元音辅音字符串计数 II(哈希表、滑动窗口)_第1张图片
(nice!!!)(LeetCode 每日一题)3306. 元音辅音字符串计数 II(哈希表、滑动窗口)_第2张图片

思路:恰好包含k个,可以转换为“至少包含k个”减去“至少包含k+1个”。用哈希表来记录元音字母出现的情况,用滑动窗口来实现符合要求的子字符串出现的数量。

基础版:(LeetCode每日一题) 3305. 元音辅音字符串计数 I(暴力枚举 || 滑动窗口、哈希表)

class Solution {
public:
    long long solve(string word,int k){
        unordered_map<char,int> sta;
        string s="aeiou";
        int ans=5;
        int ct=0;
        long long res=0;
        for(int i=0,j=0;j<word.size();j++){
            char c1=word[j];
            if(s.find(c1)!=string::npos){
                sta[c1]++;
                if(sta[c1]==1) ans--;
            }else{
                ct++;
            }
            while(i<j&&ans==0&&ct>=k){
                char c2=word[i];
                if(s.find(c2)!=string::npos){
                    sta[c2]--;
                    if(sta[c2]==0) ans++;
                }else{
                    ct--;
                }
                i++;
            }
            res+=i;
        }
        return res;

    }
    long long countOfSubstrings(string word, int k) {
        return solve(word,k)-solve(word,k+1);    
    }
};

JAVA版本:

class Solution {
    long solve(String word,int k){
        Map<Character,Integer> sta=new  HashMap<>();
        String s="aeiou";
        int ans=5;
        int ct=0;
        long res=0;
        for(int i=0,j=0;j<word.length();j++){
            char c1=word.charAt(j);
            if(s.indexOf(c1)!=-1){
                sta.put(c1,sta.getOrDefault(c1,0)+1);
                if(sta.get(c1)==1) ans--;
            }else{
                ct++;
            }
            while(i<j&&ans==0&&ct>=k){
                char c2=word.charAt(i);
                if(s.indexOf(c2)!=-1){
                    sta.put(c2,sta.getOrDefault(c2,0)-1);
                    if(sta.get(c2)==0) ans++;
                }else{
                    ct--;
                }
                i++;
            }
            res+=i;
        }
        return res;

    }
    public long countOfSubstrings(String word, int k) {
        return solve(word,k)-solve(word,k+1);
    }
}

你可能感兴趣的:(java版刷题,LeetCode,leetcode,散列表,c++,java,算法)