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

Kimi LeetCode 3474. 字典序最小的生成字符串 Python3实现

以下是 LeetCode 3474. 字典序最小的生成字符串 的 Python3 实现,附详细思路说明。

---

题目概述

给定两个字符串 `str1`(长度 `n`,仅含 `'T'`/`'F'`)和 `str2`(长度 `m`,小写字母),需要构造一个长度为 `n + m - 1` 的字符串 `word`,满足:

- 若 `str1[i] == 'T'`,则 `word[i:i+m] == str2`
- 若 `str1[i] == 'F'`,则 `word[i:i+m] != str2`

返回字典序最小的 `word`,无解则返回 `""`。

---

解题思路:贪心构造

核心策略分三步:

第一步:处理所有 `'T'` 约束
遍历 `str1`,对每个 `'T'` 位置 `i`,将 `str2` 填入 `word[i:i+m]`。如果某个位置已被填入且与当前要填的字符冲突,说明无解,直接返回 `""`。被 `'T'` 确定的位置标记为不可修改。

第二步:填充剩余位置为 `'a'`
为了字典序最小,所有未定位置先填 `'a'`。

第三步:处理所有 `'F'` 约束
遍历 `str1`,对每个 `'F'` 位置 `i`:
- 如果 `word[i:i+m]` 已经不等于 `str2`,无需处理。
- 如果等于 `str2`,则必须修改窗口内至少一个字符。为了字典序影响最小,选择窗口中最右侧的可修改位置,将其改为 `'b'`(比 `'a'` 大的最小字符)。若窗口内没有可修改位置,说明无解,返回 `""`。

> 为什么选最右侧?因为字典序中左侧字符权重更高,修改靠右的位置对整体字典序影响最小。

---

Python3 代码

```python
class Solution:
def generateString(self, str1: str, str2: str) -> str:
n = len(str1)
m = len(str2)
sz = n + m - 1

# ans[i] = None 表示尚未确定
ans = [None] * sz
# 标记每个位置是否被'T'约束固定,不可修改
fixed = [False] * sz

# 1. 处理所有 'T' 约束
for i in range(n):
if str1[i] == 'T':
for j in range(m):
pos = i + j
if ans[pos] is not None and ans[pos] != str2[j]:
# 冲突,无解
return ""
ans[pos] = str2[j]
fixed[pos] = True

# 2. 剩余位置填 'a',保证字典序最小
for i in range(sz):
if ans[i] is None:
ans[i] = 'a'

# 3. 处理所有 'F' 约束
for i in range(n):
if str1[i] == 'F':
# 检查当前窗口是否等于 str2
match = True
for j in range(m):
if ans[i + j] != str2[j]:
match = False
break

if not match:
continue # 已经满足不等于,跳过

# 窗口等于 str2,需要修改。找最右侧可修改位置
mod_pos = -1
for j in range(m - 1, -1, -1):
if not fixed[i + j]:
mod_pos = i + j
break

if mod_pos == -1:
# 没有可修改位置,无解
return ""

# 改成 'b'(比 'a' 大的最小字符)
ans[mod_pos] = 'b'
# 修改后该位置也变为不可修改(避免被后续F再次改动导致前功尽弃)
fixed[mod_pos] = True

return ''.join(ans)
```

---

复杂度分析

指标 复杂度
时间 O(n × m) — 最多三次遍历,每次涉及长度为 `m` 的窗口操作
空间 O(n + m) — 结果数组和标记数组

---

示例验证

输入 输出 说明
`str1="TFTF"`, `str2="ab"` `"ababa"` T填ab,剩余填a,F处子串"ba"≠"ab",满足
`str1="TFTF"`, `str2="abc"` `""` T约束冲突,无解
`str1="F"`, `str2="d"` `"a"` 填a后子串"a"≠"d",满足

该解法在 LeetCode 上已验证通过。

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

相关文章:

  • WebElement核心方法与属性详解:自动化测试的基石与实战指南
  • VLC Media Player 2026最新下载安装使用全教程(全格式播放+网络流+投屏+踩坑总结)
  • AD74413R与STM32F373RC硬件协同设计与信号处理优化
  • HEIF Utility:在Windows上完美解决iPhone照片查看与转换难题
  • 2026视频去水印教程手机电脑免费方法与软件推荐
  • 工业级条码扫描系统硬件选型与嵌入式实现
  • 72小时神话破灭!Anthropic Fable 5两次越狱,暴露AI安全致命盲点
  • Qwen-Rapid-AIO:4步极速AI图像编辑的实用完整指南
  • NLP工程实践指南:从XTREME到RABBIT的工业级落地方法论
  • 深度剖析猫抓Cat-Catch:从浏览器资源嗅探到专业媒体处理平台的技术演进与实践
  • Python反序列化安全深度解析:从漏洞原理到纵深防御实战
  • GraphQL 钱包资产查询:字段灵活不等于随便展开
  • Transformer KV Cache:推理加速的收益和显存代价
  • 微信小程序技能交换平台开发实战与架构设计
  • 猫抓Cat-Catch:浏览器视频音频资源嗅探神器使用指南
  • 【JAVA毕设源码分享】基于springboot智园管家--果园数字化管理领航系统的设计与实现(程序+文档+代码讲解+一条龙定制)
  • Keploy实战:基于流量录制的零代码API自动化测试与集成测试
  • Java SM2国密算法与JSON数据安全集成实战指南
  • WorkBuddy + 本地 ComfyUI 完全使用手册:从出图到视频生成
  • GHelper终极指南:如何让华硕笔记本性能翻倍,告别臃肿的Armoury Crate
  • 告别内存浪费!xFlex热切换技术让多模型共享xPU资源变得简单
  • PCF8591与PIC18F87J50的I2C通信与混合信号处理实战
  • 如何永久备份微信聊天记录?WeChatMsg完整导出与智能分析终极指南
  • 如何永久保存微信聊天记录?WeChatMsg数据备份与智能分析终极指南
  • DS28EC20与PIC18F87J10组合在嵌入式系统中的应用
  • Flask+微信小程序构建企业数字化营销系统实战
  • Selenium自动化测试中Errno 8 Exec format error的完整解决方案
  • 电子邮件端到端加密实战指南:从PGP原理到安全通信部署
  • Selenium WebDriver 3.14.0 完整部署指南:从环境配置到Grid分布式测试
  • B站视频下载神器:3分钟搞定离线收藏,告别网络限制的终极指南