Facebook Pixel

3227. Vowels Game in a String

MediumBrainteaserMathStringGame Theory
Leetcode Link

Problem Description

Alice and Bob are engaging in a competitive game using a given string s. The game begins with Alice, who has the following set of rules on each turn:

  • Alice is required to remove any non-empty substring from s containing an odd number of vowels on her turn.
  • On Bob's turn, he must remove any non-empty substring from s containing an even number of vowels.

The main objective is for the players to alternate turns removing substrings until one player cannot make a valid move and subsequently loses the game. Assume both players make the best possible moves. The task is to determine whether Alice wins the game, returning true if she does and false otherwise. English vowels are specified as a, e, i, o, and u.

Intuition

The key to solving this problem is to recognize that the win condition for Alice relies heavily on the presence of vowels in the string. Let’s denote the total number of vowels in the string as k.

  • If there are no vowels (k = 0), Alice cannot remove any substrings on her turn since there are no odd-numbered vowels, leading directly to her loss and Bob's implicit win.

  • If k is odd, Alice can choose to remove the entire string on her first move as it contains an odd number of vowels, thereby winning the game immediately.

  • If k is even, Alice has the option to remove k - 1 vowels (resulting in the string having a single vowel), leaving Bob without any valid even-numbered vowel substrings to remove. This ensures Alice will ultimately win.

In essence, as long as there is at least one vowel present in the string, Alice can always secure a win by smartly choosing a substring to remove that either leads to an odd count of remaining vowels or leaves Bob with no moves. Thus, the solution's core insight is that the presence of any vowel will result in a win for Alice.

Learn more about Math patterns.

Solution Approach

The solution to this problem is straightforward once we understand the game's structure and the properties of vowels in the string. Here's how we can efficiently determine the winner:

  1. Identify Vowels: First, we need to recognize which characters in the string s are vowels. The vowels are given as a, e, i, o, and u.

  2. Presence of Vowels Determines the Game: The winning strategy primarily involves checking the presence of vowels in the string. If there is any vowel in the string, Alice can always secure a win. The reason is based on the rules of the game that allow Alice to always find a valid move, either by removing all vowels or ensuring they are reduced to an odd count.

  3. Implementation of the Solution:

    • Create a set of vowels for quick lookup.
    • Iterate through the string to check if there is at least one vowel.
    • If a vowel is found, immediately determine that Alice has a winning strategy, as explained in the intuition.

Here is the implementation based on this rationale:

class Solution:
    def doesAliceWin(self, s: str) -> bool:
        vowels = set("aeiou")
        return any(c in vowels for c in s)

By employing the any() function, we efficiently check for the presence of vowels in the string. This check operates in O(n) time complexity, where n is the length of the string. As soon as a vowel is detected, the function returns true, indicating an assured victory for Alice.

Ready to land your dream job?

Unlock your dream job with a 2-minute evaluator for a personalized learning plan!

Start Evaluator

Example Walkthrough

Let's walk through the solution using the string s = "hello" as an example.

  1. Identify Vowels:

    • The given string s is "hello". We recognize the vowels present in the string are 'e' and 'o'.
  2. Determine the Game Outcome:

    • Total Number of Vowels (k): Count the vowels in "hello", which gives us k = 2.
    • Since k is even, Alice can remove k - 1 = 1 vowel, possibly removing the substring "hell", leaving a single vowel "o".
    • Now, Bob has to move with a string with a single vowel, which can't have an even number of vowels, leaving him with no valid moves.
  3. Implementation of the Solution:

    • We apply the strategy from the solution: check if there is at least one vowel in the string.
    • Using the provided Python code, doesAliceWin("hello") checks for the presence of vowels.
    • The function returns true upon detecting vowels in the string, confirming that Alice can secure a win.

In conclusion, as soon as we detect vowels 'e' and 'o' in "hello", Alice can always make strategic moves to ensure Bob cannot make a move, thus securing her win.

Solution Implementation

1class Solution:
2    def doesAliceWin(self, s: str) -> bool:
3        # Set of vowels to check against
4        vowels = {"a", "e", "i", "o", "u"}
5      
6        # Return True if any character in the string is a vowel
7        return any(c in vowels for c in s)
8
1class Solution {
2    // Method to determine if Alice wins based on the presence of vowels in the string
3    public boolean doesAliceWin(String s) {
4        // Iterate through each character in the string
5        for (int i = 0; i < s.length(); ++i) {
6            // Check if the current character is a vowel by checking its index in the string "aeiou"
7            if ("aeiou".indexOf(s.charAt(i)) != -1) {
8                // If a vowel is found, return true indicating Alice wins
9                return true;
10            }
11        }
12        // If no vowels are found, return false indicating Alice loses
13        return false;
14    }
15}
16
1#include <string>  // Include the necessary header for std::string
2
3class Solution {
4public:
5    // Method to determine if Alice wins based on the presence of vowels in the string
6    bool doesAliceWin(std::string s) {
7        std::string vowels = "aeiou";  // Define a string containing all the vowels
8
9        // Iterate over each character in the input string
10        for (char c : s) {
11            // Check if the character is present in the vowels string
12            if (vowels.find(c) != std::string::npos) {
13                // Return true if a vowel is found
14                return true;
15            }
16        }
17
18        // Return false if no vowels are found in the string
19        return false;
20    }
21};
22
1// Function to determine if Alice wins based on the presence of vowels in the string
2function doesAliceWin(s: string): boolean {
3    // Define a string containing all the vowel characters
4    const vowels = 'aeiou';
5
6    // Iterate over each character in the input string
7    for (const c of s) {
8        // Check if the current character is a vowel
9        if (vowels.includes(c)) {
10            // If a vowel is found, Alice wins, return true
11            return true;
12        }
13    }
14
15    // If no vowels are found, Alice does not win, return false
16    return false;
17}
18

Time and Space Complexity

The time complexity of the code is O(n), where n is the length of the string s. This is because the code iterates through the entire string s exactly once to check if there is a vowel present.

The space complexity of the code is O(1). This is because the amount of extra space used by the code does not depend on the size of the input string. The set vowels is a fixed-size collection, and no additional data structures are used that scale with n.

Learn more about how to find time and space complexity quickly.


Discover Your Strengths and Weaknesses: Take Our 2-Minute Quiz to Tailor Your Study Plan:
Question 1 out of 10

What data structure does Breadth-first search typically uses to store intermediate states?


Recommended Readings

Want a Structured Path to Master System Design Too? Don’t Miss This!


Load More