华为机试:最长的指定瑕疵度的元音子串

题目来源

  • 华为机试:最长的指定瑕疵度的元音子串

题目描述

华为机试:最长的指定瑕疵度的元音子串_第1张图片
华为机试:最长的指定瑕疵度的元音子串_第2张图片

题目解析

滑动窗口太容易出错了

我们把它想象成一个队列,无脑往queue中塞元素,并且记录非元音的个数,当非元音的个数等于flow个时,记录最长长度

如果超过了flow个,则从队头开始丢弃元素,直到不超过flow个,或者队列空了位置。

最终,我把整个字符串的所有元素,都往队列里丢过一遍,就算循环结束了。

#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 

using namespace std;



class Solution{
    bool isVowel(char ch){
        //定义一个字典,用于匹配是否是元音音符,这里用啥数据结构都行,只要查找快就行。
        set<char> vowel = {'a','e','i','o','u','A','E','I','O','U' };
        return vowel.count(ch);
    }

    bool isNotVowel(char ch){
        return !isVowel(ch);
    }
public:
    // flaw,取值范围[0, 65535]
    void subArrayLength(std::string str, int flow){

        //queue 队列, idx是索引,maxLen是记录的最大长度,no_vowel是当前队列中已经保存了多少个非元音字符
        std::queue<char> queue;
        int idx = 0, maxLen = 0, no_vowel = 0;
        while (idx < str.size()){
            char ch = str[idx];
            queue.push(ch);

            //如果刚刚加入队列的是一个非元音字符,则no_vowel加1。
            if(isNotVowel(ch)){
                no_vowel++;
            }

            //如果超了,则要处理队头。
            while (no_vowel > flow && !queue.empty()){
                ch = queue.front(); queue.pop();
                if(isNotVowel(ch)){
                    --no_vowel;
                }
            }

            maxLen = std::max(maxLen, (int)queue.size());
            idx++;
        }

        //最后一顿操作完了,如果整个过程no_vowel都没有达到 flaw,则不满足题目要求,则输出0。
        if (no_vowel != flow)
        {
            maxLen = 0;
        }

        cout << maxLen << endl;
    }

};

int main(){
    Solution a;
    a.subArrayLength("asdbuiodevauufgh", 0);
    return 0;
}


你可能感兴趣的:(算法与数据结构,华为)