2025-03-09:字符串元音游戏。用go语言,小红和小明正在进行一个涉及字符串的游戏。 给定一个字符串 s,小红和小明交替进
2025-03-09:字符串元音游戏。用go语言,小红和小明正在进行一个涉及字符串的游戏。
给定一个字符串 s,小红和小明交替进行,游戏由小红开始:
1.在小红的回合,她必须从字符串 s 中去掉一个含有奇数个元音的非空子字符串。
2.在小明的回合,他需要去掉一个含有偶数个元音的非空子字符串。
如果某一位玩家在其回合中无法找到符合条件的子字符串进行移除,便会输掉游戏。假设两位玩家都采取最优策略。
如果小红最终赢得比赛,返回 true;如果小明胜出,则返回 false。
1 <= s.length <= 100000。
s 仅由小写英文字母组成。
输入: s = “leetcoder”。
输出: true。
解释:
小红可以执行如下移除操作来赢得游戏:
1.小红先手,她可以移除加下划线的子字符串 s = “leetcoder”,其中包含 3 个元音。结果字符串为 s = “der”。
2.小明接着,他可以移除加下划线的子字符串 s = “der”,其中包含 0 个元音。结果字符串为 s = “er”。
3.小红再次操作,她可以移除整个字符串 s = “er”,其中包含 1 个元音。
4.又轮到小明,由于字符串为空,无法执行移除操作,因此小红赢得游戏。
答案2025-03-09:
题目来自leetcode3227。
大体步骤如下:
1.初始化字符串为 “leetcoder”,小红先手。
2.小红移除含有奇数个元音的非空子字符串,找到第一个含有 3 个元音的子字符串"lee",移除后得到 “tcoder”。
3.轮到小明,小明移除含有偶数个元音的非空子字符串,找到不含元音的子字符串"tcoder",移除后得到 “tcoder”。
4.小红继续,移除含有奇数个元音的非空子字符串"tcoder",此时只剩下"tcoder"中的"o"一个元音,得到空字符串""。
5.轮到小明,无法找到符合条件的子字符串进行移除,小红赢得游戏。
在这个过程中,小红和小明交替进行操作,找到符合条件的子字符串进行移除直到游戏结束。最终小红获胜,返回 true。
总的时间复杂度:
-
在 doesAliceWin 函数中,使用了 strings.ContainsAny 方法,时间复杂度为 O(n),其中 n 为字符串 s 的长度,因为需要遍历整个字符串 s。
-
游戏过程中,如果字符串长度为 n,则最多进行 n-1 次移除操作,因此总的时间复杂度为 O(n)。
总的额外空间复杂度:
- 代码中并没有使用额外空间来存储数据,只是对字符串进行操作,因此总的额外空间复杂度为 O(1)。
Go完整代码如下:
package main
import (
"fmt"
"strings"
)
func doesAliceWin(s string) bool {
return strings.ContainsAny(s, "aeiou")
}
func main() {
s := "leetcoder"
result := doesAliceWin(s)
fmt.Println(result)
}

Python完整代码如下:
# -*-coding:utf-8-*-
def does_alice_win(s: str) -> bool:
return any(char in 'aeiou' for char in s)
if __name__ == "__main__":
s = "leetcoder"
result = does_alice_win(s)
print(result)

- 点赞
- 收藏
- 关注作者
评论(0)