方法一:暴力方法
// [5918] 统计字符串中的元音子字符串
class Solution {
public int countVowelSubstrings(String word) {
// 长度小于5直接返回
if(word.length() < 5)
return 0;
// ans : 返回的结果
// le : 当前遍历左下标
// ri : 当前遍历右下标
int ans = 0, le = 0, ri = 0;
// 记录当前符合的元音个数
Map<Character, Integer> map = new HashMap<>();
// 提前放好元音字母,方便后面检测
map.put('a',0);
map.put('e',0);
map.put('i',0);
map.put('o',0);
map.put('u',0);
// 记录是否连续出现元音
boolean isCon = false;
// 按字节遍历word字符串
while(ri < word.length()){
char c = word.charAt(ri);
// 当前字符不是元音
if(!map.containsKey(c)){
// 如果之前是连续的
if(isCon){
// 清空记录数据
map.put('a',0);
map.put('e',0);
map.put('i',0);
map.put('o',0);
map.put('u',0);
// 将le移动向下一位置
le++;
// 将ri同步到和le相同的位置
ri = le;
}else{
// 将ri移动向下一位置
ri++;
// 将le同步到和ri相同的位置
le = ri;
}
// 设置当前状态
isCon = false;
continue;
}else{
// 设置当前状态
isCon = true;
// 将ri移动向下一位置
ri++;
}
// 保存记录
map.put(c, 1);
// 如果是连续的连续元音字符串
if(map.get('a') > 0 && map.get('e') > 0 && map.get('i') > 0 && map.get('o') > 0 && map.get('u') > 0)
ans++;
}
// 不连续则直接返回
if(!isCon)
return ans;
// 连续,继续检测不断将le向前移动的情况
while(le < word.length()){
if(ri >= word.length()){
// 剩余长度小于5直接返回
if(ri - le < 5)
break;
// 继续le的下一个位置
le++;
ri = le;
map.put('a',0);
map.put('e',0);
map.put('i',0);
map.put('o',0);
map.put('u',0);
}
// 记录当前ri
map.put(word.charAt(ri), 1);
// 移动到ri下一个位置
ri++;
// 记录结果
if(map.get('a') > 0 && map.get('e') > 0 && map.get('i') > 0 && map.get('o') > 0 && map.get('u') > 0)
ans++;
}
return ans;
}
}