【一看就会一写就废 指间算法】字符串元音游戏 —— 脑筋急转弯

69 阅读2分钟

指尖划过的轨迹,藏着最细腻的答案~

题目:

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

给你一个字符串 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
解释:
小红在她的第一回合无法执行移除操作,因此小红输掉了游戏。

提示:

1 <= s.length <= 10510^5
s 仅由小写英文字母组成。

分析:

分情况讨论:

  • 没有元音字符时:由于小红先手,没有移除所以必输
  • 奇数个元音字符时:此时,小红可以移除所有元音字符,必赢
  • 偶数个元音字符时:此时,小红可以先移除奇数个元音字符,偶数-奇数=奇数;小明移除偶数个元音字符,奇数-偶数=奇数,然后小红把所有奇数个元音字符移除,必赢

根据上面分析,只要有元音字符,则小红必赢,否则必输

AC代码:

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