【字符串】B047_LC_定长子串中元音的最大数目(滑动窗口)

一、Problem

Given a string s and an integer k.Return the maximum number of vowel letters in any substring of s with length k.

Vowel letters in English are (a, e, i, o, u).

Input: s = "abciiidef", k = 3
Output: 3
Explanation: The substring "iii" contains 3 vowel letters.

Constraints:

1 <= s.length <= 10^5
s consists of lowercase English letters.
1 <= k <= s.length

二、Solution

方法一:滑动窗口

最大数据为 1 0 5 10^5 105,不能用 O ( n 2 ) O(n^2) O(n2) 时间去枚举子串

逻辑不严谨代码:当循环退出时,l = r 会漏掉很多情况,所以 WA 了一发…

class Solution {
    public int maxVowels(String s, int k) {
        int max = 0, l = 0, r = 0, n = s.length(), win[] = new int[258];
        HashSet<Character> st = new HashSet<>();
        st.add('a');st.add('e');st.add('i');st.add('o');st.add('u');
        int cnt = 0;
        
        while (r < n) {
            int cnt = 0;
            while (true) {
                if (r-l+1 > k)
                    break; 
                char cr = s.charAt(r);
                if (st.contains(cr)) {
                    cnt++;
                    r++;
                }
            }
            max = Math.max(max, cnt);
            l = r;
        }
        return max;
    }
}

修正逻辑:

  • 窗口的含义
    • 囊括长度 >= k 的所有子串
  • 窗口右移时机
    • 每次都右移
  • 窗口左移时机
    • 当窗口的大小大于 k 时,证明当前窗口是不合法的,所以就通过缩小窗口来维护长度窗口的大小为 k
  • 结算时机
    • 实时记录元音字符的个数
class Solution {
    public int maxVowels(String s, int k) {
        int n = s.length(), l = 0, r = 0, cnt = 0, max = 0;
        Set<Character> st = new HashSet<>();
        st.add('a');st.add('e');st.add('i');st.add('o');st.add('u');
        char[] cs = s.toCharArray();

        while (r < n) {
            while (r-l+1 > k) {
                if (st.contains(cs[l]))
                    cnt--;
                l++;
            }
            if (st.contains(cs[r]))
                cnt++;
            r++;
            max = Math.max(max, cnt);
        }
        return max;
    }
}

复杂度分析

  • 时间复杂度: O ( n ) O(n) O(n)
  • 空间复杂度: O ( 1 ) O(1) O(1)

你可能感兴趣的:(#,【滑窗,&,双指针】)