comments | difficulty | edit_url | rating | source | tags | ||||
---|---|---|---|---|---|---|---|---|---|
true |
Medium |
1451 |
Weekly Contest 407 Q2 |
|
Alice and Bob are playing a game on a string.
You are given a string s
, Alice and Bob will take turns playing the following game where Alice starts first:
- On Alice's turn, she has to remove any non-empty substring from
s
that contains an odd number of vowels. - On Bob's turn, he has to remove any non-empty substring from
s
that contains an even number of vowels.
The first player who cannot make a move on their turn loses the game. We assume that both Alice and Bob play optimally.
Return true
if Alice wins the game, and false
otherwise.
The English vowels are: a
, e
, i
, o
, and u
.
Example 1:
Input: s = "leetcoder"
Output: true
Explanation:
Alice can win the game as follows:
- Alice plays first, she can delete the underlined substring in
s = "leetcoder"
which contains 3 vowels. The resulting string iss = "der"
. - Bob plays second, he can delete the underlined substring in
s = "der"
which contains 0 vowels. The resulting string iss = "er"
. - Alice plays third, she can delete the whole string
s = "er"
which contains 1 vowel. - Bob plays fourth, since the string is empty, there is no valid play for Bob. So Alice wins the game.
Example 2:
Input: s = "bbcd"
Output: false
Explanation:
There is no valid play for Alice in her first turn, so Alice loses the game.
Constraints:
1 <= s.length <= 105
s
consists only of lowercase English letters.
Let's denote the number of vowels in the string as
If
If
If
In conclusion, if the string contains vowels, then Little Red wins; otherwise, Little Ming wins.
The time complexity is
class Solution:
def doesAliceWin(self, s: str) -> bool:
vowels = set("aeiou")
return any(c in vowels for c in s)
class Solution {
public boolean doesAliceWin(String s) {
for (int i = 0; i < s.length(); ++i) {
if ("aeiou".indexOf(s.charAt(i)) != -1) {
return true;
}
}
return false;
}
}
class Solution {
public:
bool doesAliceWin(string s) {
string vowels = "aeiou";
for (char c : s) {
if (vowels.find(c) != string::npos) {
return true;
}
}
return false;
}
};
func doesAliceWin(s string) bool {
vowels := "aeiou"
for _, c := range s {
if strings.ContainsRune(vowels, c) {
return true
}
}
return false
}
function doesAliceWin(s: string): boolean {
const vowels = 'aeiou';
for (const c of s) {
if (vowels.includes(c)) {
return true;
}
}
return false;
}