尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

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

DeepSeek    LeetCode 3777. 使子字符串变交替的最少删除次数 Python3实现
📅 发布时间:2026/7/29 12:21:44

没问题,这是 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。

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

相关新闻

  • NS-USBloader:一站式解决Switch游戏安装难题的跨平台工具
  • Intel Edison开发板环境搭建、编程与硬件通信实战指南
  • LTE Cat 1bis模块与ARM Cortex-M4F的物联网通信方案

最新新闻

  • 泰安典尚装饰:一家专注环保整装的本土家装服务商
  • 免费解密网易云音乐ncm文件:3分钟掌握ncmdumpGUI完整使用指南
  • GPU加速下的矩阵运算优化:转置、逆与行列式计算
  • ArduSat:用开源硬件与Arduino打造低成本立方星,开启公民航天新纪元
  • 深入解析DMA架构:从核心原理到TI AM64x/AM243x数据搬移实践
  • AI Agent 架构设计选型指南:ChatBot / Workflow / Agent / Harness 怎么选?

日新闻

  • 金融舆情监测系统:多语言情感分析与实时可视化技术解析
  • QT C++调用Python异常处理:PyBind11实战与跨语言编程指南
  • A-47双麦回音消除模块:主次麦空间分布与差分连接对ENC性能的影响

周新闻

  • 大连理工大学与东京大学联手打造的“主动型AI助手“
  • 170.2026年国家级科研瓶颈:超精密单点金刚石切削(SPDT)光学表面生成
  • SongBloom:革命性歌曲生成框架深度解析——如何通过交织自回归与扩散模型创作完整音乐

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号