小红和小明在玩一个字符串元音游戏。
给你一个字符串 s
,小红和小明将轮流参与游戏,小红先开始:
-
在小红的回合,她必须移除
s
中包含 奇数 个元音的任意 非空子字符串。
-
在小明的回合,他必须移除
s
中包含 偶数 个元音的任意 非空子字符串。
第一个无法在其回合内进行移除操作的玩家输掉游戏。假设小红和小明都采取 最优策略。
如果小红赢得游戏,返回 true
,否则返回 false
。
英文元音字母包括:a
, e
, i
, o
, 和 u
。
示例 1:
输入: s = "leetcoder"
输出: true
解释:
小红可以执行如下移除操作来赢得游戏:
- 小红先手,她可以移除加下划线的子字符串
s = "
++leetco++der"
,其中包含 3 个元音。结果字符串为s = "der"
。- 小明接着,他可以移除加下划线的子字符串
s = "
++d++er"
,其中包含 0 个元音。结果字符串为s = "er"
。- 小红再次操作,她可以移除整个字符串
s = "
++er++"
,其中包含 1 个元音。- 又轮到小明,由于字符串为空,无法执行移除操作,因此小红赢得游戏。
示例 2:
输入: s = "bbcd"
输出: false
解释:
小红在她的第一回合无法执行移除操作,因此小红输掉了游戏。
提示:
1 <= s.length <= 105
s
仅由小写英文字母组成。
我的解答:
class Solution {
public boolean doesAliceWin(String s) {
/**
* 小红获胜条件,初始子串和小明操作后的子串中剩余元音字母的数量为奇数
* 小明获胜条件,小红操作后的子串剩余元音字母的数量为偶数
* 但当子串中有n个元音字母(n > 0)时,
* 若n为偶数,小红进行操作后,会变为奇数,小明无法取走剩余元音,若为奇数时,小红可以直接取走所有元音
* 若n为奇数,小明进行操作后,依旧剩余奇数个,小红可直接取走所有元音
* 即初始子串中无论有多少个元音字母,只要有,都是小红获胜,
* 当且仅当初始子串不包含元音时,即小红第一回合就无法操作时,小明赢
*/
for(char ch : s.toCharArray()){
switch(ch){
case 'a':
case 'e':
case 'i':
case 'o':
case 'u':
return true;
}
}
return false;
}
}