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

解决leetcode第3597题分割字符串

3597. 分割字符串

难度:中等

问题描述:

给你一个字符串 s,按照以下步骤将其分割为 互不相同的段 :

从下标 0 开始构建一个段。

逐字符扩展当前段,直到该段之前未曾出现过。

只要当前段是唯一的,就将其加入段列表,标记为已经出现过,并从下一个下标开始构建新的段。

重复上述步骤,直到处理完整个字符串 s。

返回字符串数组 segments,其中 segments[i] 表示创建的第 i 段。

示例 1:

输入: s = "abbccccd"

输出: ["a","b","bc","c","cc","d"]

解释:

下标 添加后 已经出现过    当前段            新段        更新后

        的段     的段              是否已经出现过?          已经出现过的段

0     "a"        []                                 否        ""            ["a"]

1     "b"        ["a"]                            否        ""            ["a", "b"]

2     "b"        ["a", "b"]                     是         "b"          ["a", "b"]

3     "bc"      ["a", "b"]                     否         ""            ["a", "b", "bc"]

4     "c"        ["a", "b", "bc"]            否          ""            ["a", "b", "bc", "c"]

5     "c"        ["a", "b", "bc", "c"]      是         "c"           ["a", "b", "bc", "c"]

6    "cc"       ["a", "b", "bc", "c"]      否          ""            ["a", "b", "bc", "c", "cc"]

7  "d"     ["a", "b", "bc", "c", "cc"]  否         ""         ["a", "b", "bc", "c", "cc", "d"]

因此,最终输出为 ["a", "b", "bc", "c", "cc", "d"]。

示例 2:

输入: s = "aaaa"

输出: ["a","aa"]

解释:

下标   添加          已经               当前段                 新段     更新后

          后的段      出现过的段    是否已经出现过?            已经出现过的段

0       "a"              []                    否                          ""         ["a"]

1       "a"             ["a"]                是                           "a"        ["a"]

2       "aa"          ["a"]                 否                            ""         ["a", "aa"]

3       "a"            ["a", "aa"]         是                            "a"       ["a", "aa"]

因此,最终输出为 ["a", "aa"]。

提示:

1 <= s.length <= 105

s 仅包含小写英文字母。

问题分析:

根据题目的描述,从0号字符开始向后拓展构建新段,在拓展时,只要该段在之前未出现过,就将其加入新段列表,并从下一个下标开始构建新段,所以从一个下标开始找出一个新段是解决问题的关键,为此设计函数struct_new_paragraph(i,s,pars),其功能是从下标i开始在字符串s中拓展新段,并将新段加入新段列表pars中,函数返回构建下一个新段的起始位置和本次生成的新段列表,这样可以反复调用本函数以拓展后续的新段。

主程序根据输入的字符串s,从索引号0开始利用struct_new_paragraph(i,s,pars)函数拓展新段,只要返回的起始位置小于字符串s的长度n,就可以不断拓展,最后将新段列表输出,即是问题的解。

程序如下:

#通过起始位置i、原字符串s和新段列表pars构造新段,返回下一个新段的起始位置和本次生成的新段列表
def struct_new_paragraph(i,s,pars):n=len(s)# j用于控制结束位置,所以当起位置i取到n-1时,j要取到n+1for j in range(i+1,n+1):a=s[i:j]print('截取字符串:',a)if a not in pars:pars.append(a)print(f'新段起始位置{j},新段列表{pars}')return j,parselse:print(f'{a}已经在新段列表中')continueelse:print('j,pars:',n,pars)return n,pars#主程序
s=input('pls input s=')
pars=[]
n=len(s)
print('新段起始位置为0,新段列表为[]')
(i,pars)=struct_new_paragraph(0,s,pars)
while i<n:i, pars = struct_new_paragraph(i, s, pars)
print(f'起始位置索引号{i}已经超过字符串{s}的最大索引号{n-1}')
print(f'最终输出新段列表为{pars}')

运行实例一

pls input s=abaacd

新段起始位置为0,新段列表为[]

截取字符串: a

新段起始位置1,新段列表['a']

截取字符串: b

新段起始位置2,新段列表['a', 'b']

截取字符串: a

a已经在新段列表中

截取字符串: aa

新段起始位置4,新段列表['a', 'b', 'aa']

截取字符串: c

新段起始位置5,新段列表['a', 'b', 'aa', 'c']

截取字符串: d

新段起始位置6,新段列表['a', 'b', 'aa', 'c', 'd']

起始位置索引号6已经超过字符串abaacd的最大索引号5

最终输出新段列表为['a', 'b', 'aa', 'c', 'd']

运行实例二

pls input s=bbbbbb

新段起始位置为0,新段列表为[]

截取字符串: b

新段起始位置1,新段列表['b']

截取字符串: b

b已经在新段列表中

截取字符串: bb

新段起始位置3,新段列表['b', 'bb']

截取字符串: b

b已经在新段列表中

截取字符串: bb

bb已经在新段列表中

截取字符串: bbb

新段起始位置6,新段列表['b', 'bb', 'bbb']

起始位置索引号6已经超过字符串bbbbbb的最大索引号5

最终输出新段列表为['b', 'bb', 'bbb']

运行实例三

pls input s=abbcccd

新段起始位置为0,新段列表为[]

截取字符串: a

新段起始位置1,新段列表['a']

截取字符串: b

新段起始位置2,新段列表['a', 'b']

截取字符串: b

b已经在新段列表中

截取字符串: bc

新段起始位置4,新段列表['a', 'b', 'bc']

截取字符串: c

新段起始位置5,新段列表['a', 'b', 'bc', 'c']

截取字符串: c

c已经在新段列表中

截取字符串: cd

新段起始位置7,新段列表['a', 'b', 'bc', 'c', 'cd']

起始位置索引号7已经超过字符串abbcccd的最大索引号6

最终输出新段列表为['a', 'b', 'bc', 'c', 'cd']

理清处理问题的逻辑顺序,合理分割其中的处理步骤,转换成对应的函数,问题必将容易解决。

http://www.dtcms.com/a/264097.html

相关文章:

  • 【一起来学AI大模型】模型上下文协议(MCP)详解:背景、架构与应用
  • 从0开始学习R语言--Day35--核密度动态估计
  • Node.js-path模块
  • 12【进程间通信——管道】
  • 记本好书:矩阵力量:线性代数全彩图解+微课+Python编程
  • 【Go-策略模式】告别if/else hell,拥抱 Go 语言策略模式
  • js基础知识
  • 【组合数学】P11362 [NOIP2024] 遗失的赋值|普及+
  • 事务隔离级别深度解析:机制、语法与实战指
  • 力扣74 搜索二维矩阵
  • [密码学实战]深入解析ASN.1和DER编码:以数字签名值为例(三十一)
  • UniApp完全支持快应用QUICKAPP-以及如何采用 Uni 模式开发发行快应用优雅草卓伊凡
  • 从 Copilot 到 通用 Agent : 大厂在 AI Coding 上的应用和挑战
  • 华为云开始了“开发者空间 AI Agent 开发”活动
  • Anthropic 开源 LLM“电路追踪器”:首次可视化语言模型的“推理路径”!
  • SQLite与MySQL:嵌入式与客户端-服务器数据库的权衡
  • 使用mavros启动多机SITL仿真
  • 9-2 MySQL 分析查询语句:EXPLAIN(详细说明)
  • react-数据Mock实现——json-server
  • Jenkins 插件深度应用:让你的CI/CD流水线如虎添翼 [特殊字符]
  • 华锐互动:全方位定制化 VR 内容制作服务流程剖析​
  • [Python 基础课程]字符串
  • Redis集群数据流解析:从分层设计到一致性难题破解
  • Vue3 中 Excel 导出的性能优化与实战指南
  • A模块 系统与网络安全 第三门课 网络通信原理-3
  • Badoo×亚矩云手机:社交约会革命的“云端心跳加速剂“
  • 论文阅读:Align and Prompt (ALPRO 2021.12)
  • 狂神说 - Mybatis 学习笔记 --下
  • SVN 分支管理(本文以Unity项目为例)
  • 【C++】inline的作用