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

 

 

思路:

采用双指针方法遍历字符串;

1)初始时左右边界指针都指向位置0;

2)边界判断:左元音右缺陷(right++)、左缺陷右元音(left++)、左右都缺陷(left++、right++)、左右都元音(计算缺陷度);

3)计算元音字串的长度:

    1. 先判断当前缺陷度是否满足要求,小于则right++,大于则left++;

    2. 缺陷度符合要求后,才计算当前字串长度,并和历史最大值比较,更新最大值。

#include <iostream>
#include <string>

using namespace std;
int GetLongestFlawedVowelSubstrLen(const size_t flaw, const string& input)
{
    int element[128] = {0};
    element['a'] = 1;
    element['A'] = 1;
    element['e'] = 1;
    element['E'] = 1;
    element['i'] = 1;
    element['I'] = 1;
    element['o'] = 1;
    element['O'] = 1;
    element['u'] = 1;
    element['U'] = 1;
    int noeleCnt = 0;
    int length = input.length();
    int left = 0;
    int right = 0;
    int maxLen = 0;
    int currentLen = 0;
    while (right < length) {
        if (!element[input[right]]) {
            noeleCnt++;
            right++;
            continue;
        }
        while (!element[input[left]]) {
            noeleCnt--;
            left++;
        }
        if (noeleCnt == flaw) {
            currentLen = right - left + 1;
            maxLen = currentLen > maxLen ? currentLen : maxLen;
            right++;
        } else if (noeleCnt < flaw) {
            right++;
        } else if (noeleCnt > flaw) {
            while (element[input[left]] == 1) {
                left++;
            }
            noeleCnt--;
            left++;
        }
    }
    return maxLen;
}

int main()
{
    size_t flaw;
    cin >> flaw;

    string input;
    cin >> input;

    cout << GetLongestFlawedVowelSubstrLen(flaw, input) << endl;
    return 0;
}

 

posted @ 2022-01-28 09:25  A-inspire  Views(1323)  Comments(0Edit  收藏  举报