| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566 |
- package leetcode.p1456;
- import java.util.HashSet;
- import java.util.Set;
- /**
- * @ProjectName: LeetCode
- * @FileName: Solution
- * @Author: 杨逸
- * @Data:2026/3/8 15:35
- * @Description: https://leetcode.cn/problems/maximum-number-of-vowels-in-a-substring-of-given-length/description/
- * 1456. 定长子串中元音的最大数目
- */
- public class Solution {
- public int maxVowels(String s, int k) {
- //定长滑动窗口解法
- //关注进入窗口的字符和离开窗口的字符
- Set<Character> set = new HashSet<>();
- set.add('a');
- set.add('e');
- set.add('i');
- set.add('o');
- set.add('u');
- int count = 0;
- int ans = 0;
- for (int i = 0; i < s.length(); i++) {
- if (i >= k) {
- //离开窗口的字符
- if (set.contains(s.charAt(i - k))) count--;
- }
- //进入窗口的字符
- if (set.contains(s.charAt(i))) count++;
- ans = Math.max(ans, count);
- }
- return ans;
- }
- /**
- * 前缀和,计算最大期间差
- * 前缀和统计当前长度已经出现多少个元音字符
- * 以k为长度的滑动窗口,统计窗口内元音字符的个数
- * @param s
- * @param k
- * @return
- */
- private int prefixSolution(String s, int k){
- //前缀和
- int[] prefix = new int[s.length()+1];
- int count = 0;
- int max = 0;
- Set<Character> set = new HashSet<>();
- set.add('a');
- set.add('e');
- set.add('i');
- set.add('o');
- set.add('u');
- for (int i = 0; i < s.length(); i++) {
- if (set.contains(s.charAt(i)))count++;
- prefix[i+1] = count;
- }
- for (int i = k; i < prefix.length; i++) {
- if (prefix[i]- prefix[i-k] > max)max = prefix[i] - prefix[i-k];
- }
- return max;
- }
- }
|