当前位置: 首页 > news >正文

DeepSeek LeetCode 3777. 使子字符串变交替的最少删除次数 Python3实现

没问题,这是 LeetCode 3777 的 Python 线段树解法。核心思路完全一致:通过线段树维护每个区间的左端点字符、右端点字符以及最小删除次数,合并时只需检查左右相邻字符是否相同。

```python
from typing import List

class Solution:
def minDeletions(self, s: str, queries: List[List[int]]) -> List[int]:
n = len(s)
arr = list(s) # 方便原地修改字符
tree = [None] * (4 * n + 5) # 线段树数组,每个节点存 (左字符, 右字符, 删除次数)

# ---------- 合并两个相邻区间 ----------
def merge(left, right):
if left is None:
return right
if right is None:
return left
lc, rc, cnt = left[0], right[1], left[2] + right[2]
# 左区间的右端点 和 右区间的左端点 相同,则必须在交界处删掉一个字符
if left[1] == right[0]:
cnt += 1
return (lc, rc, cnt)

# ---------- 建树 ----------
def build(idx, l, r):
if l == r:
tree[idx] = (arr[l], arr[l], 0)
return
mid = (l + r) // 2
build(idx * 2, l, mid)
build(idx * 2 + 1, mid + 1, r)
tree[idx] = merge(tree[idx * 2], tree[idx * 2 + 1])

# ---------- 单点更新(翻转字符) ----------
def update(idx, l, r, pos):
if l == r:
# A <-> B 翻转
arr[l] = 'B' if arr[l] == 'A' else 'A'
tree[idx] = (arr[l], arr[l], 0)
return
mid = (l + r) // 2
if pos <= mid:
update(idx * 2, l, mid, pos)
else:
update(idx * 2 + 1, mid + 1, r, pos)
tree[idx] = merge(tree[idx * 2], tree[idx * 2 + 1])

# ---------- 区间查询 ----------
def query(idx, l, r, ql, qr):
# 完全覆盖
if ql <= l and r <= qr:
return tree[idx]
mid = (l + r) // 2
# 只在左半部分
if qr <= mid:
return query(idx * 2, l, mid, ql, qr)
# 只在右半部分
if ql > mid:
return query(idx * 2 + 1, mid + 1, r, ql, qr)
# 跨越左右两部分,需要合并
left_res = query(idx * 2, l, mid, ql, qr)
right_res = query(idx * 2 + 1, mid + 1, r, ql, qr)
return merge(left_res, right_res)

# ---------- 处理查询 ----------
build(1, 0, n - 1)
ans = []
for q in queries:
if q[0] == 1: # 更新操作:[1, index]
update(1, 0, n - 1, q[1])
else: # 查询操作:[2, l, r]
res = query(1, 0, n - 1, q[1], q[2])
ans.append(res[2])
return ans
```

🧠 核心要点提醒

1. 合并逻辑:left.del + right.del + (1 if left.rc == right.lc else 0) 是解题关键,因为只有相邻边界会互相影响。
2. 复杂度:建树 O(n),每次更新或查询均为 O(log n),总复杂度 O((n + q) log n),完美适配 10^5 数据量。
3. 索引说明:本解法默认 queries 中的下标是 0-based(LeetCode 标准),如果你的环境是 1-based,记得把更新和查询的索引都减 1。

如果对线段树合并的推导还有疑问,或者想看看其他写法(比如树状数组),可以随时告诉我,我再给你展开讲讲。😊

http://www.jsqmd.com/news/1287071/

相关文章:

  • NS-USBloader:一站式解决Switch游戏安装难题的跨平台工具
  • 基于CC2538与Z-Stack的智能电表设计:从硬件选型到ZigBee协议栈集成
  • LTE Cat 1bis模块与ARM Cortex-M4F的物联网通信方案
  • OpenClaw模块化AI框架解析与应用实践
  • Intel Edison开发板环境搭建、编程与硬件通信实战指南
  • |放弃高考独木桥,走通公办捷径|成都竞元单招2026集训全景解读 - 成都竞元单招
  • 一张衣服照片几百万个像素,AI到底在看什么?
  • Go语言高并发消息发送:WorkerPool模式实战
  • 上海水洗石路面施工企业推荐,认准隆升(上海)园林绿化工程 - 资讯纵览
  • 2026年沈阳门窗/辽宁系统门窗/断桥铝门窗厂家推荐榜单:保温隔音、节能别墅门窗与阳光房天井深度测评 - 优企名品
  • 9大网盘直链下载助手:告别限速烦恼,获取真实下载地址
  • 3步掌握TMSpeech:彻底解决离线语音转文字隐私问题的终极方案
  • 上班族塑料饭盒避坑指南 台州源头工厂推荐 - 资讯纵览
  • 三星Galaxy Glasses连接iPhone技术解析与跨平台开发实践
  • 暗黑破坏神2存档编辑器d2s-editor:终极可视化修改工具完整指南
  • 2026年河北华光领衔高速公路防眩网生产厂家挑选攻略 附行业避坑要点及优质企业盘点 - 品牌推荐达人
  • 【Linux 篇】数字世界的通信管道 —— 匿名管道与进程池深度实战解析
  • AI全栈开发工具链深度拆解,覆盖数据标注、特征工程、模型编排、推理加速、可观测性5大核心层
  • 什么瑕疵机器永远学不会?
  • TI SimpleLink Wi-Fi CC3220/CC3120:物联网设备低功耗与安全连接的终极方案
  • 终极泰坦之旅装备管理革命:TQVaultAE无限仓库系统
  • 2026上海压花地坪路面施工企业推荐,优选隆升(上海)园林绿化工程 - 资讯纵览
  • 2026年铅砖/防辐射铅砖/医用铅砖/异形铅砖,铅玻璃/射线防护铅玻璃,铅板/医用纯铅板源头厂家:精密锻造与辐射防护实力之选 - 优企名品
  • 苏州靠谱装修公司精选|2026实测口碑:清洲建筑装饰,闭口合同为核,本土深耕为基 - 商业先知
  • GetQzonehistory:三步快速完成QQ空间历史说说完整备份的免费工具
  • 储能 PCS 储能变流器测试架构设计:双向电源 KS983X 如何覆盖并网/离网工况
  • 终极Windows开发环境解决方案:5分钟完成VC运行库一键部署
  • 公众号迁移公证需要哪些材料?公众号迁移公证异地办理?
  • 智能家居光线控制器:从协议选型到自动化部署全攻略
  • 口碑好的热解气化炉源头厂家