leetcode 2062. 统计字符串中的元音子字符串

2062. 统计字符串中的元音子字符串

一、题目描述

子字符串 是字符串中的一个连续(非空)的字符序列。
元音子字符串 是 仅 由元音('a'、'e'、'i'、'o' 和 'u')组成的一个子字符串,且必须包含 全部五种 元音。
给你一个字符串 word,统计并返回 word 中 元音子字符串的数目 。
输入:word = “aeiouu”
输出:2
解释:下面列出 word 中的元音子字符串(加粗部分):
aeiouu”
aeiouu

来源:2062. 统计字符串中的元音子字符串

二、解题报告

1、思路分析

  (1)用二进制将五个元音字母和其他字母一一对应起来。

aeiou其他
0000100010001000100010000100000

  (2)利用位或运算,当mymask=11111时,即全都包含。
  (3)当子字符串中含有其他字母时,进行100000与mymask进行位与运算,会得到非零数,此时重新遍历,例:
若mymask=010110 & 100000=000000;
若mymask=101010 & 100000=100000;
  (4)若mymask=011111,则子串成立,ans增加。

2、代码详解

#define mask ((1<<5)-1)
int getchmask(char c){
    char a[]={"aeiou"};
    for(int i=0;i<5;i++){
        if(a[i]==c) return (1<<i);
    }
    return (1<<5);
}
int countVowelSubstrings(char * word){
    int ans=0;
    int mymask;
    for(int i=0;word[i];++i){
        mymask=0;
        for(int j=i;word[j];j++){
            mymask|=getchmask(word[j]); 
            if(mymask & (1<<5))
                break;
            if((mymask)==(mask))
                ans++;
        }
    }
    return ans;
}

借鉴:英雄哪里出来

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值