一、题目描述
子字符串 是字符串中的一个连续(非空)的字符序列。
元音子字符串 是 仅 由元音('a'、'e'、'i'、'o' 和 'u')
组成的一个子字符串,且必须包含 全部五种 元音。
给你一个字符串word
,统计并返回word
中 元音子字符串的数目 。
输入:word = “aeiouu”
输出:2
解释:下面列出 word 中的元音子字符串(加粗部分):
“aeiouu”
“aeiouu”
二、解题报告
1、思路分析
(1)用二进制将五个元音字母和其他字母一一对应起来。
a | e | i | o | u | 其他 |
---|---|---|---|---|---|
00001 | 00010 | 00100 | 01000 | 10000 | 100000 |
(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;
}
借鉴:英雄哪里出来