1704 Determine if String Halves Are Alike - Easy
Problem:
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.
Problem Analysis
High-Level Strategy:
-
Initialization: Initialize a string
vowels
with the vowels "aeiou". Convert the input strings
to lowercase to make the comparison case-insensitive. -
Check Length: If the length of the string
s
is odd, returnFalse
because the string cannot be split into equal halves. -
Calculate Midpoint: Calculate the midpoint of the string
s
by using integer division (length // 2
). -
Count Vowels in Halves: Count the number of vowels in the first half (
s[:mid]
) and the second half (s[mid:]
) using a generator expression and thesum
function. -
Comparison: Return
True
if the counts of vowels in the first half are equal to the counts in the second half; otherwise, returnFalse
.
Complexity:
-
Time Complexity: The time complexity is O(N), where N is the length of the input string
s
. The algorithm iterates through the string once to calculate the counts of vowels in the first and second halves. -
Space Complexity: The space complexity is O(1). The algorithm uses a constant amount of space for the
vowels
string and a few variables (length
,mid
,count_first
,count_second
). The space required does not grow with the input size.
Solutions:
class Solution:
def halvesAreAlike(self, s: str) -> bool:
vowels = "aeiou"
s = s.lower()
length = len(s)
if length % 2 == 1:
return False
mid = length // 2
count_first = sum(1 for char in s[:mid] if char in vowels)
count_second = sum(1 for char in s[mid:] if char in vowels)
return count_first == count_second