Skip to content

1371. Find the Longest Substring Containing Vowels in Even Counts 👍

  • Time: $O(n)$
  • Space: $O(1)$
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
class Solution {
 public:
  int findTheLongestSubstring(string s) {
    constexpr string_view kVowels = "aeiou";
    int ans = 0;
    int prefix = 0;  // the binary prefix
    unordered_map<int, int> prefixToIndex{{0, -1}};

    for (int i = 0; i < s.length(); ++i) {
      const int index = kVowels.find(s[i]);
      if (index != -1)
        prefix ^= 1 << index;
      if (!prefixToIndex.count(prefix))
        prefixToIndex[prefix] = i;
      ans = max(ans, i - prefixToIndex[prefix]);
    }

    return ans;
  }
};
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
class Solution {
  public int findTheLongestSubstring(String s) {
    final String kVowels = "aeiou";
    int ans = 0;
    int prefix = 0; // the binary prefix
    Map<Integer, Integer> prefixToIndex = new HashMap<>();
    prefixToIndex.put(0, -1);

    for (int i = 0; i < s.length(); ++i) {
      final int index = kVowels.indexOf(s.charAt(i));
      if (index != -1)
        prefix ^= 1 << index;
      prefixToIndex.putIfAbsent(prefix, i);
      ans = Math.max(ans, i - prefixToIndex.get(prefix));
    }

    return ans;
  }
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
class Solution:
  def findTheLongestSubstring(self, s: str) -> int:
    kVowels = 'aeiou'
    ans = 0
    prefix = 0  # the binary prefix
    prefixToIndex = {0: -1}

    for i, c in enumerate(s):
      index = kVowels.find(c)
      if index != -1:
        prefix ^= 1 << index
      prefixToIndex.setdefault(prefix, i)
      ans = max(ans, i - prefixToIndex[prefix])

    return ans