解决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.pswp.cn/pingmian/87022.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/87022.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电源芯片之DCDC初探索ING

1. 概述 DC-DC转换器的意思是直流变直流&#xff08;不同的直流电源值得转换&#xff09;&#xff0c;是一种在直流电路中将一个电压值的电能变为另一个电压值的电能装置。 DC-DC转换器一般由控制芯片、电感线圈、二极管、三极管、电容器构成。 2. 基本拓扑结构 2.1 非隔离…

JavaEE:分布式session

一、使用Redis存储分布式session&#xff1a; 1.SpringBoot整合Redis&#xff0c;见如下地址&#xff1a; JavaEE&#xff1a;SpringBoot整合Redis_a526001650a-CSDN博客 2.代码实现分布式session存储(此处以token为例)&#xff1a; Autowired private RedisTemplate<St…

OpenCV CUDA模块设备层-----“大于阈值设为零” 的图像处理函数 thresh_to_zero_inv_func()

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 OpenCV 的 CUDA 模块&#xff08;cudev&#xff09; 中的一个仿函数生成器&#xff0c;用于创建一个 “大于阈值设为零” 的图像处理函数对象。 …

FastGPT与MCP:解锁AI新时代的技术密码

一、AI 浪潮中的新星&#xff1a;FastGPT 与 MCP 登场 在当今科技飞速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;已成为推动各行业变革的核心力量。从智能语音助手到复杂的图像识别系统&#xff0c;AI 的应用无处不在&#xff0c;而其中的关键技术 —— 语言模…

browser-tools-mcp + excel-mcp-server + cursor 实现读取网页信息自动写入Excel

browser-tools-mcp excel-mcp-server cursor 实现读取网页信息自动写入Excel 文章目录 browser-tools-mcp excel-mcp-server cursor 实现读取网页信息自动写入Excel一、安装node.js和npm1、安装nvm2、安装最新版本的node.js 二、安装browser-tools-mcp1、安装 BrowserTools…

Linux安装JDK和Maven

Linux安装JDK和Maven 安装JDK1.8 oracle官网 https://www.oracle.com 下载包地址&#xff1a;https://www.oracle.com/java/technologies/downloads/archive/ 步骤1&#xff1a;官网下载压缩包 点击想要下载的版本&#xff0c;需要登录Oracle的账号&#xff0c;没有的话需要…

MySQL主从复制与数据库集群深度解析

一、主从复制核心架构与复制模式 MySQL主从复制是构建分布式数据库的基础技术&#xff0c;通过日志同步机制实现数据冗余与读写分离。其核心架构分为三层&#xff1a; 日志记录层&#xff1a;主库将数据变更写入二进制日志&#xff08;Binlog&#xff09;网络传输层&#xff…

安装emsdk 4.0.10报Connection reset by peer解决

出错如下: 使用浏览器下载所需文件 https://storage.googleapis.com/webassembly/emscripten-releases-builds/deps/node-v22.16.0-darwin-x64.tar.gz 移动到到emsdk/downloads下 修改emsdk.py download_even_if_exists=True 设置环境变量

win11,visual studio 2022,配置dcmtk,opencv

一、配置dcmtk 1 文件下载---地址&#xff0c;Software Development based on DCMTK - dicom.offis.de 源文件下载&#xff0c;选择.zip下载&#xff0c;.tar.gz为Linux和macOS下面常见的压缩包 支持库下载 解决 DCMTK 在 Windows 上编译时所需的依赖库问题 libiconv GNU有…

2025 最新 Appium Inspector 环境搭建教程

1 环境搭建背景 版本升级&#xff1a;Appium 2.0 版本替代 1.x&#xff0c;原 Appium Desktop 因安全漏洞和功能废弃不再适用。需求痛点&#xff1a;Android Studio 仅支持 debug 程序元素定位&#xff0c;需通过 Appium Inspector 实现通用 APK 元素定位。 2 环境搭建步骤 …

Vue 安装使用教程

一、Vue 简介 Vue&#xff08;读作 /vjuː/&#xff0c;类似于“view”&#xff09;是一款用于构建用户界面的渐进式 JavaScript 框架。它易于上手&#xff0c;轻量高效&#xff0c;适合快速构建前端界面&#xff0c;广泛应用于各类 Web 项目中。 二、Vue 安装方式 2.1 直接通…

通过http调用来访问neo4j时报错,curl -X POST 执行指令报错

curl -X POST ^ More? http://localhost:7474/db/neo4j/tx/commit ^ More? -H Authorization: Basic bmVvNGo6MTIzNDU2Nzg ^ More? -H Content-Type: application/json ^ More? -d { \"statements": [{\"statement": \"MATCH (n) RETURN n, label…

Node.js到底是什么

我想像是npm、vite这些名词大家都很熟悉&#xff0c;对它们的作用也有大致印象&#xff0c;但是可能都像我一样不明白Node.js到底是什么&#xff0c;这里给大家带来一个简单介绍。 Node.js 详解&#xff1a;历史发展、生态构建与底层原理 一、Node.js 的起源与历史发展 诞生背…

Rust与Go:GAN实战对决

Rust与Go生成对抗 GAN概念 GAN的全称是Generative Adversarial Network,中文翻译为生成对抗网络。这是一种深度学习模型,由两部分组成:生成器(Generator)和判别器(Discriminator)。生成器的任务是创建数据,而判别器的任务是区分生成器创建的数据和真实数据。这两部分…

pyspark driver 上传pod本地文件到对象存储

前提: pyspark driver on k8s,环境变量或者spark_home/jars 下有相关对象存储的包,报错包问题就这里添加jar即可 from py4j.java_gateway import java_import from pyspark.sql import SparkSession# ----------------------------------------------------------------------…

使用GeoServer发布地图shapefi(.shp)数据

1.创建新的工作区 2.添加新的数据存储&#xff0c;选择Shapefile - ESRI™ Shapefiles (*.shp) 如果这个发布页面退出了 可以这样找回来 点击发布返回图层我们发布的数据在图层显示 点击Layer Preview 预览 现在前端就可以用 OpenLayers地图来调用这个服务了

python+uniapp基于微信小程序的PS社区系统

文章目录 具体实现截图本项目支持的技术路线源码获取详细视频演示&#xff1a;文章底部获取博主联系方式&#xff01;&#xff01;&#xff01;&#xff01;本系统开发思路进度安排及各阶段主要任务java类核心代码部分展示主要参考文献&#xff1a;源码获取/详细视频演示 ##项目…

设计模式 - 组合思维_Unix 设计哲学三大原则

文章目录 引言Unix 哲学本质三大启示总览启示一&#xff1a;保持简单清晰性软件复杂度来源实践方法 启示二&#xff1a;借鉴组合理念Unix 组合示例避免“定制驱动”烂设计 启示三&#xff1a;重拾数据思维数据驱动编程演进案例分析 总结 引言&#xff1a;介绍 Unix 与 Unix 哲学…

C++ 快速回顾(四)

C 快速回顾&#xff08;四&#xff09; 前言一、纯虚函数二、final关键字1.作用到函数2.作用到类 三、虚函数原理四、Lambda一些知识补充 前言 用于快速回顾之前遗漏或者补充C知识 一、纯虚函数 纯虚函数主要是当接口&#xff0c;没有具体的实现要到派生类去实现。 纯虚函数…

vue入门学习时,按照官方的教程生成的vue3项目后,命令行运行npm install出现一堆warn,然后运行npm run dev报错,项目启动失败

日期&#xff1a;2025年6月27日 星期五农历六月初三 VUE版本&#xff1a;vue3 IDE&#xff1a;vs code vue入门学习时&#xff0c;按照官方的教程生成的vue3项目后&#xff0c;命令行运行npm install出现一堆warn&#xff0c;然后运行npm run dev报错&#xff0c;项目启动失败…