Published on

Exercise of the Day: Determine if String Halves Are Alike

Authors
Exercise of the Day: Determine if String Halves Are Alike

Problem:

You are given a string s of even length. Split this string into two halves of equal lengths. Two strings are alike if they have the same number of vowels

https://leetcode.com/explore/challenge/card/april-leetcoding-challenge-2021/593/week-1-april-1st-april-7th/3699/

Solution

The question already spells out the different steps:

  1. Split the string in half
  2. Count the vowels in both strings
  3. Compare count of both strings

Split String into Half

Instead of creating a function that only can split a string in two halves, we should consider creating a generic splitStringAtPosition and a second function splitStringInHalf.

export function splitStringAtPosition(s: string, pos: number): string[] {
  return [s.substr(0, pos), s.substr(pos)]
}

export function splitStringInHalf(s: string): string[] {
  return splitStringAtPosition(s, s.length / 2)
}

Counting Vowels

My original solution filtered the array and then asked for the length.

export function countVowels(s: string): number {
  const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
  return [...s].filter((val) => vowels.includes(val)).length
}

However you probably should use reduce instead to make it more readable.

export function countVowels2(s: string): number {
  const vowels = ['a', 'e', 'i', 'o', 'u', 'A', 'E', 'I', 'O', 'U']
  return [...s].reduce<number>((acc, val) => {
    return acc + Number(vowels.includes(val))
  }, 0)
}

Final Result

Now we can put everything together and end up with this very readable function

export function halvesAreAlike(s: string): boolean {
  const [a, b] = splitStringInHalf(s)
  return countVowels(a) === countVowels(b)
}