40. 最长的指定瑕疵度的元音子串

95 阅读1分钟

题目描述

​ 开头和结尾都是元音字母( a e i o u A E I O U)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度,比如:

​ “a”、"aa" 是元音字母,其瑕疵度为 0

"aiur"不是元音字符串(结尾不是元音字符)

"abira"是元音字符串,其瑕疵度为 2

给定一个字符串,请找出指定瑕疵度的最长元音字符子串,并输出其长度,如果找不到满足条件的元音字符字串,输出为"0"。

字串:字符串中任意连续的字符组成的子序列称为该字符串的子串。

输入描述

首行输入是一个整数,表示预期的瑕疵度flaw ,取值范围[ 0 , 65535]。

接下俩一行是一个仅由字符 a − z和 A − Z组成的字符串,字符串长度( 0,65535 0,65535 ]。

输出描述

输出为一个整数,代表满足条件的元音字符字串的长度。

样例

0

asdbuiodevauufgh

3

思路,滑动窗口

#include <iostream>
#include <set>
#include <vector>
#include <algorithm>
using namespace std;

int main()
{
    int k = 0;
    cin >> k;

    string str;
    cin >> str;

    int left = 0;
    int cntk = 0;
    int maxLen = 0;

    set<char> st = { 'a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U' };

    for (int right = 0; right < str.size(); ++right)
    {
        if (st.count(str[right]) == 0) // 如果非元音字符,则瑕疵度+1
        {
            cntk++;
        }
        else
        {
            while (cntk > k || st.count(str[left] == 0)) // 瑕疵度过大或者左边不是元音,需要缩小窗口
            {
                if (st.count(str[left]) == 0)
                {
                    cntk--;
                }
                left++;
            }

            if (st.count(str[left]) > 0 && st.count(str[right]) > 0 && cntk == k)
            {
                maxLen = max(maxLen, right - left + 1);
            }
        }
    }
    cout << maxLen << endl;
    return 0;
}