Solution.java 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  1. package leetcode.p1456;
  2. import java.util.HashSet;
  3. import java.util.Set;
  4. /**
  5. * @ProjectName: LeetCode
  6. * @FileName: Solution
  7. * @Author: 杨逸
  8. * @Data:2026/3/8 15:35
  9. * @Description: https://leetcode.cn/problems/maximum-number-of-vowels-in-a-substring-of-given-length/description/
  10. * 1456. 定长子串中元音的最大数目
  11. */
  12. public class Solution {
  13. public int maxVowels(String s, int k) {
  14. //定长滑动窗口解法
  15. //关注进入窗口的字符和离开窗口的字符
  16. Set<Character> set = new HashSet<>();
  17. set.add('a');
  18. set.add('e');
  19. set.add('i');
  20. set.add('o');
  21. set.add('u');
  22. int count = 0;
  23. int ans = 0;
  24. for (int i = 0; i < s.length(); i++) {
  25. if (i >= k) {
  26. //离开窗口的字符
  27. if (set.contains(s.charAt(i - k))) count--;
  28. }
  29. //进入窗口的字符
  30. if (set.contains(s.charAt(i))) count++;
  31. ans = Math.max(ans, count);
  32. }
  33. return ans;
  34. }
  35. /**
  36. * 前缀和,计算最大期间差
  37. * 前缀和统计当前长度已经出现多少个元音字符
  38. * 以k为长度的滑动窗口,统计窗口内元音字符的个数
  39. * @param s
  40. * @param k
  41. * @return
  42. */
  43. private int prefixSolution(String s, int k){
  44. //前缀和
  45. int[] prefix = new int[s.length()+1];
  46. int count = 0;
  47. int max = 0;
  48. Set<Character> set = new HashSet<>();
  49. set.add('a');
  50. set.add('e');
  51. set.add('i');
  52. set.add('o');
  53. set.add('u');
  54. for (int i = 0; i < s.length(); i++) {
  55. if (set.contains(s.charAt(i)))count++;
  56. prefix[i+1] = count;
  57. }
  58. for (int i = k; i < prefix.length; i++) {
  59. if (prefix[i]- prefix[i-k] > max)max = prefix[i] - prefix[i-k];
  60. }
  61. return max;
  62. }
  63. }