题目要求

小红和小明在玩一个字符串元音游戏。

给你一个字符串 s,小红和小明将轮流参与游戏,小红开始:

  • 在小红的回合,她必须移除 s 中包含 奇数 个元音的任意 非空 子字符串

  • 在小明的回合,他必须移除 s 中包含 偶数 个元音的任意 非空 子字符串

第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略

如果小红赢得游戏,返回 true,否则返回 false

英文元音字母包括:a, e, i, o, 和 u

示例 1:

输入: s = "leetcoder"

输出: true

解释:
小红可以执行如下移除操作来赢得游戏:

  • 小红先手,她可以移除加下划线的子字符串 s = "leetcoder",其中包含 3 个元音。结果字符串为 s = "der"

  • 小明接着,他可以移除加下划线的子字符串 s = "der",其中包含 0 个元音。结果字符串为 s = "er"

  • 小红再次操作,她可以移除整个字符串 s = "er",其中包含 1 个元音。

  • 又轮到小明,由于字符串为空,无法执行移除操作,因此小红赢得游戏。

示例 2:

输入: s = "bbcd"

输出: false

解释:
小红在她的第一回合无法执行移除操作,因此小红输掉了游戏。

解题思路

核心在于判断字符串 s 中是否存在元音字母。因为元音是英文字母 a、e、i、o、u,只要 s 里有至少一个元音,小红第一步就有操作空间(能移除含奇数个元音的子串,比如单个元音字母组成的子串),后续两人交替操作,小红能掌控节奏最终获胜;要是 s 里一个元音都没有,小红第一回合就没操作可做,直接输。

代码实现

class Solution:
    def doesAliceWin(self, s: str) -> bool:
        # 检查s中是否有元音字母,有则返回True,否则False
        return any(c in s for c in "aeiou")
class Solution {
public:
    bool doesAliceWin(string s) {
        return ranges::any_of(s, [](char c){
            return c == 'a' || c =='e' || c == 'i' || c == 'o' || c == 'u';
        });
    }
};