You are given a string s of even length. Split this string into two halves of equal lengths, and let a be the first half and b be the second half.
Two strings are alike if they have the same number of vowels ('a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U'). Notice that s contains uppercase and lowercase letters.
Return true if a and b are alike. Otherwise, return false.
Example 1:
Input: s = "book"
Output: true
Explanation: a = "bo" and b = "ok". a has 1 vowel and b has 1 vowel. Therefore, they are alike.
Example 2:
Input: s = "textbook"
Output: false
Explanation: a = "text" and b = "book". a has 1 vowel whereas b has 2. Therefore, they are not alike.
Notice that the vowel o is counted twice.
Constraints:
2 <= s.length <= 1000
s.length is even.
s consists of uppercase and lowercase letters.
Solutions
Solution 1: Counting
Thinking
We only need to know whether the two halves contain the same number of vowels. The length is at most \(1000\), so a single scan is enough.
Keep vowels of both cases in a set and walk the two halves together: increment on a vowel in the left half and decrement on one in the right. The halves match if and only if the counter ends at zero.
Traverse the string. If the number of vowels in the first half of the string is equal to the number of vowels in the second half, return true. Otherwise, return false.
The time complexity is \(O(n)\), where \(n\) is the length of the string. The space complexity is \(O(C)\), where \(C\) is the number of vowel characters.