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 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 into 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);
};

Leave a Reply

Your email address will not be published. Required fields are marked *