# LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game)
LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game)
在本篇博客中,我们将深入探讨 LeetCode 第2038题——如果相邻两个颜色均相同则删除当前颜色。该问题涉及字符串处理与游戏策略,旨在考察如何在给定规则下判断游戏的胜负。我们将详细解析问题、探索解决方案,并通过代码示例展示如何实现这一逻辑。
问题描述
背景
给定一个由 'A' 和 'B' 组成的字符串 colors,每个字符代表一个颜色片段。Alice 和 Bob 在玩一个游戏,他们轮流从字符串中删除颜色。Alice 先手。
游戏规则
-
删除规则:
- Alice 可以删除一个
'A',条件是该'A'的相邻两个颜色片段也都是'A'。 - Bob 可以删除一个
'B',条件是该'B'的相邻两个颜色片段也都是'B'。
- Alice 可以删除一个
-
限制:
- 无法删除位于字符串两端的颜色片段,因为它们没有两个相邻的颜色片段。
- 每次删除一个颜色片段后,字符串会重新连接,新的相邻关系会重新建立。
-
胜负判定:
- 如果一方无法进行删除操作,则该玩家输掉游戏,另一方获胜。
- 假设 Alice 和 Bob 都采用最优策略,判断 Alice 是否获胜。
示例
示例 1
输入: colors = "AAABABB"
输出: true
解释:
- Alice 删除中间的 'A',字符串变为 "AABABB"。
- Bob 无法进行删除操作,因为没有三个连续的 'B'。
- Alice 获胜。
示例 2
输入: colors = "AA"
输出: false
解释:
- Alice 无法进行删除操作,因为字符串长度不足。
- Bob 获胜。
示例 3
输入: colors = "ABBBBBBBAAA"
输出: false
解释:
- Alice 删除最后的 'A',字符串变为 "ABBBBBBBAA"。
- Bob 删除一个 'B',字符串变为 "ABBBBBBAA"。
- Alice 无法进行删除操作。
- Bob 获胜。
提示
1 <= colors.length <= 10^5colors只包含字母'A'和'B'
解决方案
要判断 Alice 是否能获胜,我们需要计算 Alice 和 Bob 各自能进行多少次删除操作,然后比较两者的次数。
关键观察
- 连续字符的分组:对于连续的
'A'或'B',计算其长度。 - 可删除次数:对于每一组连续的字符,只有当长度大于等于3时,才能进行删除操作。具体的删除次数为
长度 - 2。- 例如,连续5个
'A',Alice 可以进行5 - 2 = 3次删除。
- 例如,连续5个
- 总删除次数:
- Alice 的总删除次数为所有连续
'A'组的(长度 - 2)之和。 - Bob 的总删除次数为所有连续
'B'组的(长度 - 2)之和。
- Alice 的总删除次数为所有连续
- 胜负判定:如果 Alice 的删除次数大于 Bob 的删除次数,则 Alice 获胜,返回
true;否则,返回false。
算法步骤
- 初始化两个计数器
alice_moves和bob_moves分别记录 Alice 和 Bob 的可删除次数。 - 遍历字符串
colors,统计连续'A'和'B'的长度。 - 对于每个连续的
'A'或'B'组,计算其可删除次数,并累加到相应的计数器。 - 最后比较
alice_moves和bob_moves的值,判断 Alice 是否获胜。
复杂度分析
- 时间复杂度:O(n),其中 n 是字符串
colors的长度。我们只需遍历一次字符串。 - 空间复杂度:O(1),仅使用了常数级别的额外空间。
代码实现
以下是基于上述思路的 Python 实现:
class Solution:def winnerOfGame(self, colors: str) -> bool:alice_moves = 0bob_moves = 0n = len(colors)i = 0while i < n:current_char = colors[i]count = 1# 统计当前字符连续出现的次数while i + 1 < n and colors[i + 1] == current_char:count += 1i += 1# 如果连续字符数大于等于3,计算可删除次数if count >= 3:if current_char == 'A':alice_moves += count - 2else:bob_moves += count - 2i += 1# Alice 必须有比 Bob 更多的删除次数才能获胜return alice_moves > bob_moves
代码解析
-
初始化:
alice_moves = 0 bob_moves = 0 n = len(colors) i = 0alice_moves和bob_moves分别记录 Alice 和 Bob 的可删除次数。n是字符串的长度,i是当前遍历的索引。
-
遍历字符串:
while i < n:current_char = colors[i]count = 1# 统计当前字符连续出现的次数while i + 1 < n and colors[i + 1] == current_char:count += 1i += 1# 如果连续字符数大于等于3,计算可删除次数if count >= 3:if current_char == 'A':alice_moves += count - 2else:bob_moves += count - 2i += 1- 对于每一个字符,统计其连续出现的次数
count。 - 如果
count >= 3,则根据字符类型增加相应的删除次数。 - 最后,移动到下一个不同的字符。
- 对于每一个字符,统计其连续出现的次数
-
胜负判断:
return alice_moves > bob_moves- 如果 Alice 的删除次数大于 Bob 的,则 Alice 获胜,返回
true;否则,返回false。
- 如果 Alice 的删除次数大于 Bob 的,则 Alice 获胜,返回
示例运行
让我们通过几个示例来验证我们的算法。
示例 1
colors = "AAABABB"
solution = Solution()
print(solution.winnerOfGame(colors)) # 输出: True
解析:
- 连续
'A'的组:'AAA',可删除次数为3 - 2 = 1。 - 连续
'B'的组:'B'、'BB',均不足3个,不可删除。 - Alice 的删除次数
1,Bob 的删除次数0。 - 因为
1 > 0,Alice 获胜。
示例 2
colors = "AA"
solution = Solution()
print(solution.winnerOfGame(colors)) # 输出: False
解析:
- 连续
'A'的组:'AA',不足3个,不可删除。 - Alice 的删除次数
0,Bob 的删除次数0。 - 因为
0不是大于0,Alice 无法获胜。
示例 3
colors = "ABBBBBBBAAA"
solution = Solution()
print(solution.winnerOfGame(colors)) # 输出: False
解析:
- 连续
'A'的组:'A'、'AAA',可删除次数为1。 - 连续
'B'的组:'BBBBBBB',可删除次数为7 - 2 = 5。 - Alice 的删除次数
1,Bob 的删除次数5。 - 因为
1小于5,Bob 获胜。
总结
我们了解到如何通过统计连续字符的数量来判断 Alice 和 Bob 各自的删除次数。关键在于识别连续的 'A' 和 'B' 组,并根据规则计算可删除次数。最终,通过比较两者的删除次数,我们可以高效地判断游戏的胜负。
相关文章:
# LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game)
LeetCode Problem 2038: 如果相邻两个颜色均相同则删除当前颜色 (Winner of the Game) 在本篇博客中,我们将深入探讨 LeetCode 第2038题——如果相邻两个颜色均相同则删除当前颜色。该问题涉及字符串处理与游戏策略,旨在考察如何在给定规则下判断游戏的…...
Redis面试相关
Redis开篇 使用场景 缓存 缓存穿透 解决方法一: 方法二: 通过多次hash来获取对应的值。 小结 缓存击穿 缓存雪崩 打油诗 双写一致性 两种不同的要求 强一致 读锁代码 写锁代码 强一致,性能低。 延迟一致 方案一:消息队列 方…...
4.CSS文本属性
4.1文本颜色 div { color:red; } 属性值预定义的颜色值red、green、blue、pink十六进制#FF0000,#FF6600,#29D794RGB代码rgb(255,0,0)或rgb(100%,0%,0%) 4.2对齐文本 text-align 属性用于设置元素内文本内容的水平对齐方式。 div{ text-align:center; } 属性值解释left左对齐ri…...
Mongo高可用架构解决方案
Mongo主从复制哪些事(仅适用特定场景) 对数据强一致性要求不高的场景,一般微服务架构中不推荐 master节点可读可写操作,当数据有修改时,会将Oplog(操作日志)同步到所有的slave节点上。那么对于从节点来说仅只读,所有slave节点从master节点同步数据,然而从节点之间互相…...
Rabbitmq 业务异常与未手动确认场景及解决方案
消费端消费异常,业务异常 与 未手动确认是不是一个场景,因为执行完业务逻辑,再确认。解决方案就一个,就是重试一定次数,然后加入死信队列。还有就是消费重新放入队列,然后重新投递给其他消费者,…...
linux,centos7.6安装禅道
1.cd /opt 2.wget https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gz 3.tar xvzf ZenTaoPMS.18.5.zbox_64.tar.gz 4./opt/zbox/zbox --aport 4005 --mport 3307 start 安全组开启一下两个端口 –aport 4005:设置Apache启动端口为4005 –mport 3…...
java基础之代理
代理模式(Proxy Pattern) 简介 是一种结构型设计模式,主要用于为某对象提供一个代理对象,以控制对该对象的访问。通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的…...
计算机网络——期末复习(6)期末考试样例2(含答案)
一、单项选择题(每题1分,共10小题,共计10分) 1.因特网多播采用的管理协议是( )协议。 A.UDP B.BGP C.IGMP D.TCP 2.采用CIDR时,某计算机的IP地址是202.35.79.88/19,该计算机所处子网的地址是( )。 A.202.35.0.…...
JavaScript 获取DOM对象
html的标签被js获取到之后就变成了js对象,对象里面包含了标签的属性和方法 。同一时间获取多个对象则会翻译一个数组,数组元素是对象 获取方法 1. const a document.getElementById("id"),根据标签的id来获取。因为id是唯一的、…...
一文讲明白朴素贝叶斯算法及其计算公式(入门普及)
1、贝叶斯算法 贝叶斯定理由英国数学家托马斯贝叶斯 ( Thomas Bayes) 提出的,用来描述两个条件概率之间的关系。通常,事件A在事件B 发生的条件下与事件 B 在事件 A 发生的条件下,它们两者的概率并不相同,但是它们两者之间存在一定…...
实际开发中,常见pdf|word|excel等文件的预览和下载
实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…...
Python自学 - 递归函数
1 Python自学 - 递归函数 递归函数是一种在函数体内调用自己的函数,就像“左脚踩着右脚,再右脚踩着左脚… 嗯,你就可以上天了!”。递归函数虽然不能上天,但在处理某些场景时非常好用, 一种典型的场景就是遍…...
Spark-Streaming有状态计算
一、上下文 《Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量,那么如何才能统计从开始加载数据到当下的所有数量呢?下面我们就来通过官方例子学习下Spark-Streaming有状态计算。 二、官方例子 所属包:org.…...
Markdown如何导出Html文件Markdown文件
Markdown如何导出Html文件Markdown文件 前言语法详解小结其他文章快来试试吧☺️ Markdown 导出 HTML 👈点击这里也可查看 前言 Markdown的源文件以md为后缀。Markdown是HTML语法的简化版本,它本身不带有任何样式信息。我们所看到的Markdown网页(如&…...
使用Python进行图像裁剪和直方图分析
一、简介 在数字图像处理领域,裁剪和分析图像的直方图是两个非常基本且重要的操作。本文将通过一个简单的Python项目,展示如何使用skimage和matplotlib库来裁剪图像并分析其RGB通道的直方图。 二、环境准备 在开始之前,请确保你已经安装了以…...
企业内管信息化系统
本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…...
【python因果库实战15】因果生存分析4
这里写目录标题 加权标准化生存分析总结个体层面的生存曲线 加权标准化生存分析 我们还可以将加权与标准化结合起来,使用 WeightedStandardizedSurvival 模块。在这里,我们将逆倾向得分加权模型(根据基线协变量重新加权人群)与加…...
Linux 线程详解
目录 一、线程概述 二、线程创建 三、线程终止 四、线程回收 五、线程取消 六、线程分离 七、线程安全 一、线程概述 线程是进程内的一个执行单元,是进程内可调度的实体。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空…...
云架构:考量与框架
云架构:考量与框架 引言 在当今的数字化环境中,云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素,讨论重要的考量因素、设计指南,以及最佳实践…...
SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!
目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念,所以直接整理可能用到的东西。 sd简单的说…...
web vue 项目 Docker化部署
Web 项目 Docker 化部署详细教程 目录 Web 项目 Docker 化部署概述Dockerfile 详解 构建阶段生产阶段 构建和运行 Docker 镜像 1. Web 项目 Docker 化部署概述 Docker 化部署的主要步骤分为以下几个阶段: 构建阶段(Build Stage):…...
DAY 47
三、通道注意力 3.1 通道注意力的定义 # 新增:通道注意力模块(SE模块) class ChannelAttention(nn.Module):"""通道注意力模块(Squeeze-and-Excitation)"""def __init__(self, in_channels, reduction_rat…...
力扣-35.搜索插入位置
题目描述 给定一个排序数组和一个目标值,在数组中找到目标值,并返回其索引。如果目标值不存在于数组中,返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 class Solution {public int searchInsert(int[] nums, …...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
智能AI电话机器人系统的识别能力现状与发展水平
一、引言 随着人工智能技术的飞速发展,AI电话机器人系统已经从简单的自动应答工具演变为具备复杂交互能力的智能助手。这类系统结合了语音识别、自然语言处理、情感计算和机器学习等多项前沿技术,在客户服务、营销推广、信息查询等领域发挥着越来越重要…...
scikit-learn机器学习
# 同时添加如下代码, 这样每次环境(kernel)启动的时候只要运行下方代码即可: # Also add the following code, # so that every time the environment (kernel) starts, # just run the following code: import sys sys.path.append(/home/aistudio/external-libraries)机…...
C#学习第29天:表达式树(Expression Trees)
目录 什么是表达式树? 核心概念 1.表达式树的构建 2. 表达式树与Lambda表达式 3.解析和访问表达式树 4.动态条件查询 表达式树的优势 1.动态构建查询 2.LINQ 提供程序支持: 3.性能优化 4.元数据处理 5.代码转换和重写 适用场景 代码复杂性…...
Scrapy-Redis分布式爬虫架构的可扩展性与容错性增强:基于微服务与容器化的解决方案
在大数据时代,海量数据的采集与处理成为企业和研究机构获取信息的关键环节。Scrapy-Redis作为一种经典的分布式爬虫架构,在处理大规模数据抓取任务时展现出强大的能力。然而,随着业务规模的不断扩大和数据抓取需求的日益复杂,传统…...
在 Spring Boot 项目里,MYSQL中json类型字段使用
前言: 因为程序特殊需求导致,需要mysql数据库存储json类型数据,因此记录一下使用流程 1.java实体中新增字段 private List<User> users 2.增加mybatis-plus注解 TableField(typeHandler FastjsonTypeHandler.class) private Lis…...
深度剖析 DeepSeek 开源模型部署与应用:策略、权衡与未来走向
在人工智能技术呈指数级发展的当下,大模型已然成为推动各行业变革的核心驱动力。DeepSeek 开源模型以其卓越的性能和灵活的开源特性,吸引了众多企业与开发者的目光。如何高效且合理地部署与运用 DeepSeek 模型,成为释放其巨大潜力的关键所在&…...
