开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为其瑕疵度(JS)

# 声明

个人原创,如有错误和不足,敬请指正,转载请注明出处

题目描述


定义:开头和结尾都是元音字母(aeiouAEIOU)的字符串为元音字符串,其中混杂的非元音字母数量为瑕疵度。比如:

  1. “a”、“aa”是元音字符串,其瑕疵度都为0
  2. “aiur”不是元音字符串(结尾不是元音字符)
  3. “abira”是元音字符串,其瑕疵度为2

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

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

解答要求


时间限制:1000ms,内存限制:256MB

输入

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

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

输出

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

样例


输入

0  asdbuiodevauufgh

输出 3

提示 :满足条件的最长元音字符子串有两个,分别为uio和auu,长度为3。


输入

2 aeueo

输出 0

提示 : 没有满足条件的元音字符子串,输出0.


输入

1 aabeebuu

输出 5

提示 满足条件的最长元音字符子串有两个,分别为aabee和eebuu,长度为5


解题思路:为了简便,只考虑小写字母,需分缺陷数为0和不为0两种情况,方便处理边界问题,具体思路如下:

用双指针遍历字符串

         * 参数说明 max为符合条件的最长元音字符串,flaw为要求的缺陷数

         *  第0步: 如果缺陷字符数要求为0;则特殊处理,一旦碰到非元音字符,则计算当前元音字符串长度并更新max,否则进入第1步:

         *  第1步:找到第一个元音字符,记录位置p,首先令i=p,j = p+1,curFlaw = 0开始遍历

         *  第2步:移动j,

         *      2.1 直到满足curFlaw = flaw,每找到一个缺陷字符则将curFlaw加一 ,且当前字符为元音字符,此时如果后面依旧是元音字符,继续移动j直到后面一个字符不是元音字符位置,或者到了尾部,记录此时字符串长度,并更新最大长度

         *      2.2 直到满足curFlaw = flaw ,但当前字符依旧为缺陷字符,此时curFlaw > flaw,继续移动j,直到找到第一个元音字符,或者到了末尾(这种情况直接结束遍历)

         *  3. 将i向右移动,直到找到第一个缺陷字符,并找到后面第一个元音字符,curFlaw-- ;

         *      3.1 如果满足curFlaw  < flaw,重复第2步

         *      3.2 如果满足curFlaw == flaw,记录此时字符串长度,并更新最大长度

         *      3.3 如果满足curFlaw > flaw, 重复第3步

         *      3.4 如果i==j 则回到第2步

最后贴上代码

/** 
         *  思路:用双指针遍历字符串
         *  max为符合条件的最长元音字符串
         * 
         *  0 如果缺陷字符数要求为0;则特殊处理,一旦碰到非元音字符,则计算当前元音字符串长度并更新max
         *  否则:
         *  1.找到第一个元音字符,记录位置p,首先令i=p,j = p+1,curFlaw = 0开始遍历
         *  2.移动j,
         *      2.1 直到满足curFlaw = flaw,每找到一个缺陷字符则将curFlaw加一 ,且当前字符为元音字符,此时如果后面依旧是元音字符,继续移动j直到后面一个字符不是元音字符位置,或者到了尾部,记录此时字符串长度,并更新最大长度
         *      2.2 直到满足curFlaw = flaw ,但当前字符依旧为缺陷字符,此时curFlaw > flaw,继续移动j,直到找到第一个元音字符,或者到了末尾(这种情况直接结束遍历)
         *  3. 将i向右移动,直到找到第一个缺陷字符,并找到后面第一个元音字符,curFlaw-- ;
         *      3.1 如果满足curFlaw  < flaw,重复第2步
         *      3.2 如果满足curFlaw == flaw,记录此时字符串长度,并更新最大长度
         *      3.3 如果满足curFlaw > flaw, 重复第3步
         *      3.4 如果i==j 则回到第2步
         * 
         * **/

        function getFlawStr(str,flaw) {
            let i =0, j=0, curFlaw = 0;
            let max = 0;
            let res = [];
            for(let k=0;k<str.length;k++) {
                if(map[str[i]]) {
                    i=k;j=k+1;
                    break;
                }
            }
            if(flaw == 0) {
                let k = 0;
                while(k < str.length) {
                    if(!map[str[k]]) {
                        let len = k-i;
                        if(len > max) {
                            max = len;
                            res.push(str.slice(i,k))
                        };
                        k++;
                        i=k;
                    }else {
                        k++;
                    }
                }
                console.log(max,res,'max '+flaw);
                return max;
            }
            while(j< str.length) {
                if(!map[str[j]]) {
                    curFlaw += 1;
                    j++;
                    continue;
                }else if(map[str[j+1]]){
                    j++;
                    continue;
                }else {
                    if(curFlaw < flaw) {
                        j++;
                        continue;
                    }
                    if(curFlaw == flaw) {
                        let len = j-i+1;
                        if(len > max) {
                            max = len;
                            res.push(str.slice(i,j+1))
                        };
                    }
                    i++;
                    while(i!=j) {
                        if(!map[str[i]]) {
                            curFlaw--;
                            i++;
                            continue;
                        }else if(map[str[i+1]]) {
                            i++;
                            continue;
                        }else {
                            if(curFlaw < flaw) {
                                break;
                            }else if(curFlaw == flaw) {
                                let len = j-i+1;
                                if(len > max) {
                                    max = len;
                                    res.push(str.slice(i,j+1))
                                };
                                i++;
                            }else {
                                i++;
                            }
                        }
                    }
                    j++;
                }
            }
            console.log(max,res,'max '+flaw);
            return max;
        }
        var flaw = 1;
        var str = 'asdbuiodevauufgh';
        var map = {
            a: 1,
            e: 1,
            i: 1,
            o: 1,
            u: 1
        }
        getFlawStr(str,flaw);
        flaw = 0;
        getFlawStr(str,flaw);
        flaw = 3;
        getFlawStr(str,flaw);
  • 8
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值