深入探索串的高级操作:从算法到 LeetCode 实战

串是编程中最常用的数据结构之一,从简单的文本处理到复杂的文本匹配算法,串的应用无处不在。在掌握了串的基本概念、存储结构以及KMP算法之后,现在让我们深入探索串的更多高级操作,例如求子串、串的替换等,并通过LeetCode上的题目实战训练来进一步提升我们对串的处理能力。

 

一、串的高级操作

(一)求子串

概念 :从一个较长的字符串中提取一个连续的部分作为子串。例如,“hello world” 的子串可以是 “hello”、“world”、“lo wo” 等。

 

Python 实现 :在Python中,求子串非常简单,可以通过切片操作来实现。

python

def get_substring(s, start, length):

    return s[start:start + length]

 

# 示例

text = "hello world"

substring = get_substring(text, 6, 5) # 提取 "world"

print(substring) # 输出: world

 

(二)串的替换

概念 :在一个字符串中查找特定的子串,并将其替换为另一个字符串。例如,将字符串 "hello world" 中的 "world" 替换为 "everyone",结果为 "hello everyone"。

 

Python 实现 :Python 的 `str.replace()` 方法提供了强大的替换功能。

python

def replace_substring(s, old, new):

    return s.replace(old, new)

 

# 示例

text = "hello world"

new_text = replace_substring(text, "world", "everyone")

print(new_text) # 输出: hello everyone

 

(三)字符串反转

概念 :将字符串中的字符顺序完全颠倒。例如,“hello” 反转后变为 “olleh”。

 

Python 实现 :可以通过切片操作或 `reversed` 函数来实现。

python

def reverse_string(s):

    return s[::-1]

 

# 或者

def reverse_string(s):

    return ''.join(reversed(s))

 

# 示例

text = "hello"

reversed_text = reverse_string(text)

print(reversed_text) # 输出: olleh

 

(四)字符串去重

概念 :去除字符串中的重复字符,只保留第一次出现的字符。例如,“abcabc” 去重后变为 “abc”。

 

Python 实现 :可以使用集合来记录已经出现过的字符。

python

def remove_duplicates(s):

    seen = set()

    result = []

    for char in s:

        if char not in seen:

            seen.add(char)

            result.append(char)

    return ''.join(result)

 

# 示例

text = "abcabc"

unique_text = remove_duplicates(text)

print(unique_text) # 输出: abc

 

二、LeetCode 实战题目训练

(一)【题目】:无重复字符的最长子串(LeetCode 3)

题目描述 :给定一个字符串,找出其中不含有重复字符的最长子串的长度。

 

解题思路 :使用滑动窗口技术。用两个指针表示一个窗口的左右边界,移动右边界扩展窗口,当遇到重复字符时,移动左边界收缩窗口。同时维护一个集合记录窗口内的字符,以及一个变量记录最长无重复子串的长度。

 

Python 实现 :

def length_of_longest_substring(s):

    char_set = set()

    left = 0

    max_length = 0

    for right in range(len(s)):

        while s[right] in char_set:

            char_set.remove(s[left])

            left += 1

        char_set.add(s[right])

        max_length = max(max_length, right - left + 1)

    return max_length

 

# 示例

text = "abcabcbb"

print(length_of_longest_substring(text)) # 输出: 3

 

(二)【题目】:字符串中的第一个唯一字符(LeetCode 387)

 

题目描述 :给定一个字符串,找到第一个不重复的字符,并返回其在字符串中的位置。如果不存在,则返回 -1。

 

解题思路 :可以使用哈希表统计每个字符的出现次数,然后再次遍历字符串找到第一个出现次数为1的字符的位置。

 

Python 实现 :

def first_uniq_char(s):

    char_count = {}

    for char in s:

        char_count[char] = char_count.get(char, 0) + 1

    for index, char in enumerate(s):

        if char_count[char] == 1:

            return index

    return -1

 

# 示例

text = "leetcode"

print(first_uniq_char(text)) # 输出: 0

 

(三)【题目】:字符串的排列(LeetCode 567)

 

题目描述 :给定两个字符串 s1 和 s2,写一个函数来判断 s2 是否包含 s1 的排列。换句话说,第一个字符串的排列之一是第二个字符串的子串。

 

解题思路 :使用滑动窗口和哈希表来解决。维护一个窗口,使窗口内的字符计数与 s1 的字符计数相匹配。如果匹配成功,则 s2 包含 s1 的排列。

 

Python 实现 :

def check_inclusion(s1, s2):

    from collections import Counter

    len1, len2 = len(s1), len(s2)

    if len1 > len2:

        return False

    counter1 = Counter(s1)

    counter2 = Counter(s2[:len1])

    if counter1 == counter2:

        return True

    for i in range(len1, len2):

        counter2[s2[i]] += 1

        counter2[s2[i - len1]] -= 1

        if counter2[s2[i - len1]] == 0:

            del counter2[s2[i - len1]]

        if counter1 == counter2:

            return True

    return False

 

# 示例

s1 = "ab"

s2 = "eidbaooo"

print(check_inclusion(s1, s2)) # 输出: True

 

三、总结与交流

通过深入学习串的高级操作,包括求子串、串的替换、字符串反转和去重,我们进一步拓展了对串的处理能力。同时,通过在LeetCode上解决一系列与串相关的题目,我们不仅巩固了理论知识,还提升了解决实际问题的能力。

听听大家在学习串的高级操作和解决LeetCode题目过程中的体验和见解。有没有在解决某个题目时发现独特的解题思路?或者在实际项目中应用这些操作时遇到了什么挑战?欢迎在评论区分享你的故事,让我们一起交流学习,共同进步!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/bicheng/84030.shtml

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

相关文章

在rocky linux 9.5上在线安装 docker

前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …

OneNet + openssl + MTLL

1.OneNet 使用的教程 1.在网络上搜索onenet,注册并且登录账号。 2.产品服务-----物联网服务平台立即体验 3.在底下找到立即体验进去 4.产品开发------创建产品 5.关键是选择MQTT,其他的内容自己填写 6.这里产品以及开发完成,接下来就是添加设…

【Fiddler工具判断前后端Bug】

Fiddler工具判断前后端Bug的方法 使用Fiddler抓包工具可以高效定位问题是出在前端还是后端,主要通过分析请求和响应的内容、状态码、数据格式等关键信息。 分析请求是否成功发送 检查请求是否从客户端正确发出,观察Fiddler抓取的请求列表。若请求未出…

【论文阅读笔记】《A survey on deep learning approaches for text-to-SQL》

文章目录 一、论文基本信息1. 文章标题2. 所属刊物/会议3. 发表年份4. 作者列表5. 发表单位 二、摘要三、解决问题四、创新点五、自己的见解和感想六、研究背景七、研究方法(模型、实验数据、评估指标)八、总结(做了什么、得到了什么、有什么…

【强连通分量 缩点 最长路 拓扑排序】P2656 采蘑菇|普及+

本文涉及知识点 C图论 强连通分量 缩点 最长路 拓扑排序 P2656 采蘑菇 题目描述 小胖和 ZYR 要去 ESQMS 森林采蘑菇。 ESQMS 森林间有 N N N 个小树丛, M M M 条小径,每条小径都是单向的,连接两个小树丛,上面都有一定数量的…

Dubbo Logback 远程调用携带traceid

背景 A项目有调用B项目的服务&#xff0c;A项目使用 logback 且有 MDC 方式做 traceid&#xff0c;调用B项目的时候&#xff0c;traceid 没传递过期&#xff0c;导致有时候不好排查问题和链路追踪 准备工作 因为使用的是 alibaba 的 dubbo 所以需要加入单独的包 <depend…

nodejs:用 nodemailer 发送一封带有附件的邮件

我们将使用 nodemailer 库来发送带有附件的邮件。 首先&#xff0c;确保已经安装了nodemailer。如果没有安装&#xff0c;可以通过 npm install nodemailer 来安装。 cnpm install nodemailer --save dependencies: – nodemailer ^7.0.3 步骤&#xff1a; 引入nodemailer模…

Scade 语言概念 - 方程(equation)

在 Scade 6 程序中自定义算子(Operator)的定义、或数据流定义(data_def)的内容中&#xff0c;包含一种基本的语言结构&#xff1a;方程(equation)(注1)。在本篇中&#xff0c;将叙述 Scade 语言方程的文法形式&#xff0c;以及作用。 注1: 对 Scade 中的 equation, 或 equation…

STM32开发,创建线程栈空间大小判断

1. 使用RTOS提供的API函数&#xff08;以FreeRTOS为例&#xff09; 函数原型&#xff1a;UBaseType_t uxTaskGetStackHighWaterMark(TaskHandle_t xTask)功能&#xff1a;获取指定任务堆栈中剩余的最小空间&#xff08;以字为单位&#xff0c;非字节&#xff09;。使用步骤&am…

thinkphp8.1 调用巨量广告API接口,刷新token

1、在mysql中建立表sys_token; CREATE TABLE sys_token (id int UNSIGNED NOT NULL,access_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,expires_in datetime NOT NULL,refresh_token varchar(50) COLLATE utf8mb4_general_ci NOT NULL,refresh_token_expires_in …

【leetcode】递归,回溯思想 + 巧妙解法-解决“N皇后”,以及“解数独”题目

&#x1f4da;️前言 &#x1f31f; 本期内容亮点&#xff1a;我们将深入解析力扣&#xff08;LeetCode&#xff09;上的几道经典算法题&#xff0c;涵盖不同难度和题型&#xff0c;帮助大家掌握解题思路和代码实现技巧。无论是准备面试还是提升算法能力&#xff0c;这些题解都…

【iOS安全】iPhone X iOS 16.7.11 (20H360) WinRa1n 越狱教程

前言 越狱iPhone之后&#xff0c;一定记得安装一下用于屏蔽更新的描述文件&#xff08;可使用爱思助手&#xff09; 因为即便关闭了自动更新&#xff0c;iPhone仍会在某些时候自动更新系统&#xff0c;导致越狱失效&#xff1b;更为严重的是&#xff0c;更新后的iOS版本可能是…

​​高频通信与航天电子的材料革命:猎板PCB高端压合基材技术解析​​

—聚酰亚胺/陶瓷基板在5G与航天场景的产业化应用​​ ​​一、极端环境材料体系&#xff1a;突破温域与频率极限​​ ​​聚酰亚胺基板&#xff08;PI&#xff09;的航天级稳定性​​ 猎板在卫星通信PCB中采用真空层压工艺处理聚酰亚胺基材&#xff08;Dk≈10.2&#xff09;&a…

pikachu靶场通关笔记13 XSS关卡09-XSS之href输出

目录 一、href 1、常见取值类型 2、使用示例 3、安全风险 二、源码分析 1、进入靶场 2、代码审计 3、渗透思路 三、渗透实战 1、注入payload1 2、注入payload2 3、注入payload3 本系列为通过《pikachu靶场通关笔记》的XSS关卡(共10关&#xff09;渗透集合&#xff…

day26-计算机网络-4

1. tcp的11种状态 ss -ant -a 表示看所有状态 -n 表示不将ip解析为主机名 -t 表示tcp 1.1. closed状态&#xff08;客户端、服务端&#xff09; 客户端发起建立连接前的状态服务端启动服务前的状态 1.2. listen状态&#xff08;服务端&#xff09; 服务端软件运行的时候状…

基于autodl部署Cross-Modal-Re-ID-baseline

https://arxiv.org/abs/2001.04193 https://github.com/mangye16/Cross-Modal-Re-ID-baseline/tree/master?tabreadme-ov-file# 需要SYSU-MM01.zip pip install numpy pandas scipy scikit-learn pillow tqdm把SYSU-MM01放到…/Datasets/SYSU-MM01/ori_data下 先运行pytho…

线程安全集合

前置阅读&#xff1a; 数据结构等算法概念 树堆排序 锁相关概念&#xff1a; 锁概念锁实现 队列 Queue 与 Deque 的区别 Queue 是单端队列&#xff0c;只能从一端插入元素&#xff0c;另一端删除元素&#xff0c;实现上一般遵循 先进先出&#xff08;FIFO&#xff09; 规则…

ESP32与STM32

ESP32与STM32深度对比&#xff1a;物联网与嵌入式开发的王者之争 一、核心架构对比 1.1 ESP32 - 无线物联网霸主 // 典型双核架构配置 #include "freertos/FreeRTOS.h" #include "freertos/task.h"void app_main() {// 核心0执行无线通信任务xTaskCreat…

在SpringBoot中使用AWS SDK实现邮箱验证码服务

1.依赖导入&#xff08;maven&#xff09; <dependency><groupId>software.amazon.awssdk</groupId><artifactId>ses</artifactId><version>2.31.46</version></dependency> 2.申请两个key 发件人邮箱需要验证&#xff1a; …

从零到一:Maven 快速入门教程

目录 Maven 简介Maven 是什么为什么使用 Maven&#xff1f; 安装 Maven下载 Maven 配置 Maven解压文件配置本地仓库保存路径配置国内仓库地址 Maven 的核心概念了解 pom.xml 文件坐标依赖范围生命周期compileprovidedruntimetestsystemimport 依赖传递依赖排除依赖循环 继承1. …