【Python 数据结构 8.串】

目录

一、串的基本概念

1.串的概念

2.获取串的长度

3.串的拷贝

4.串的比较

5.串的拼接

6.串的索引

二、Python中串的使用

1.串的定义

2.串的拼接

3.获取串的长度

4.获取子串位置

5.获取字符串的索引

6.字符串的切片

7.字符串反转

8.字符串的比较

9.字符串的赋值

三、实战

1.344. 反转字符串

方法一、库函数

思路与算法

方法二、双指针

思路与算法

算法步骤

方法三、直接使用列表切片操作

切片操作(s[::-1])​​

2.434. 字符串中的单词数

方法一、标记法

思路与算法

方法二、split函数分割

思路与算法

3.1704. 判断字符串的两半是否相似

方法一、分别遍历字符串的前后部分

算法和思路

方法二、一行代码


先成为自己的山,再去找心中的海

                                                —— 25.3.5

一、串的基本概念

1.串的概念

        串,又叫字符串,是由一系列字符组成的数据结构,用于表示文本或字符序列。在编程中,字串,符串通常用双引号括起来,如"Hello,World!"

        而实际在内存中存储的时候,字符串最后还会有一个 '\0' 的字符('\0'的ASCII的值为 0),它代表了这个串的结尾


2.获取串的长度

        串的长度是指字符串中包含的字符个数。每个语言都有内置方法来获取字符串的长度(注意:字符串长度是不包含最后一一个 ' \0 ' 的)


3.串的拷贝

有时需要创建一个字符串的副本,而不修改原始字符串。一般可通过遍历串的方式实现串的拷贝。


4.串的比较

        串的比较是指比较两个串是否相等,一般可以采用遍历的方式逐个比较,当然一些语言提供了内置比较函数


5.串的拼接

        将两个串拼接在一起,一般是申请一块新的内存,新的内存的大小是两个需要拼接的字符串的长度之和加一,然后第一个串的字符挨个赋值到新的内存,再将第二个串的字符挨个赋值到新的内存,最后加上一个 ‘ \0 ' ,就实现完毕了。


6.串的索引

        可以使用索引来访问字符串中的特定字符。索引从 0 开始,表示第一个字符的位置,依次递增,可以使用 [] 并传入索引值来获取字符


二、Python中串的使用

1.串的定义

直接用 " "' ' 定义串

# 空串的定义
s = ''
s = ""

2.串的拼接

+ 将两个字符串拼接在一起

# 串的拼接
s = s + "hello"
print(s)

3.获取串的长度

len() 函数获取长度

len(): 返回对象的长度或元素的数量

参数描述
obj要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。
# 获取串的长度
print(len(s))

4.获取子串位置

获取子串第一次出现的位置,如果没有出现,则返回 -1

find():Python 中用于在字符串中查找子串的内置方法。它的作用是返回子串在字符串中首次出现的索引位置,如果子串不存在,则返回 -1。find() 函数区分大小写,并且可以通过指定起始和结束位置来限制查找范围。

参数名类型默认值描述
sub字符串要查找的子串。
start整数0查找的起始位置,默认为 0。
end整数字符串长度查找的结束位置,默认为字符串的长度。
# 获取子串第一次出现的位置,子串在字符串中没有出现,则返回 -1
idx = s.find("hello")
print(idx)

5.获取字符串的索引

索引从 0 开始,到 长度 - 1 结束

# 获取字符串的索引
print(s[0])
print(s[1])
print(s[2])

6.字符串的切片

# 从第二个字符,间隔两个位置,取到倒数第三个字符前的字符。
# "hello world" h:0, e:1, l:2, l:3, o:4, ' ':5, w:6, o:7, r:8, l:9, d:10
#               h:-11, e:-10, l:-9, l:-8, o:-7, ' ':-6, w:-5, o:-4, r:-3, l:-2, d:-1
# el o
print(s[1:-3:2])

7.字符串反转

# 字符串反转
print("反转:",s[::-1])

8.字符串的比较

# 字符串的比较
s = "hello world"
print(s == "hello world")

9.字符串的赋值

# 字符串的赋值
s = "hello China"
print(s)

三、实战

1.344. 反转字符串

编写一个函数,其作用是将输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。

不要给另外的数组分配额外的空间,你必须原地修改输入数组、使用 O(1) 的额外空间解决这一问题。

示例 1:

输入:s = ["h","e","l","l","o"]
输出:["o","l","l","e","h"]

示例 2:

输入:s = ["H","a","n","n","a","h"]
输出:["h","a","n","n","a","H"]

提示:

  • 1 <= s.length <= 105
  • s[i] 都是 ASCII 码表中的可打印字符

方法一、库函数

思路与算法

原地反转​:list.reverse() 是Python列表的内置方法,能够直接修改原列表,将元素顺序完全倒置。例如:列表 ['h','e','l','l','o'] 调用 reverse() 后变为 ['o','l','l','e','h'],且不返回新列表,完全符合题目“原地修改”的要求。​

​​时间复杂度O(n),需要遍历列表一半长度的元素进行对称交换。

空间复杂度O(1),仅通过指针操作交换元素,不占用额外空间。

列表.reverse(): Python 中用于反转列表元素顺序的内置方法。它直接在原列表上进行操作,不会返回新的列表,而是直接修改原列表的顺序。

class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        s.reverse()
        


方法二、双指针

思路与算法

双指针策略:设置两个指针lr,分别指向字符串列表的头部(初始为0)和尾部(初始为len(s)-1)​

对称交换:每次循环交换lr位置的字符,随后l右移、r左移,直到l >= r时终止循环。​

原地操作:直接在输入的列表s上修改,不占用额外空间,符合题目要求。

算法步骤

初始化指针l = 0r = len(s) - 1。​

循环交换:当l < r时,交换s[l]s[r]的字符。l递增1,r递减1,缩小指针范围。

终止条件:当l >= r时,所有对称位置的字符已完成交换,整个列表完成反转。

len(): 返回对象的长度或元素的数量

参数描述
obj要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。
class Solution:
    def reverseString(self, s: List[str]) -> None:
        """
        Do not return anything, modify s in-place instead.
        """
        l = 0
        r = len(s) - 1
        while(l < r):
            t = s[l]
            s[l] = s[r]
            s[r] = t
            l += 1
            r -= 1


方法三、直接使用列表切片操作

切片操作(s[::-1])​​

切片会创建新列表,需额外 O(n) 空间,不符合题目“原地修改”的要求


2.434. 字符串中的单词数

统计字符串中的单词个数,这里的单词指的是连续的不是空格的字符。

请注意,你可以假定字符串里不包括任何不可打印的字符。

示例:

输入: "Hello, my name is John"
输出: 5
解释: 这里的单词是指连续的不是空格的字符,所以 "Hello," 算作 1 个单词。

方法一、标记法

思路与算法

初始化变量n 是字符串 s 的长度。preIsBlank 是一个布尔变量,用于记录前一个字符是否是空格。初始值为 Falsesum 用于记录段数,初始值为 0

遍历字符串:对于字符串中的每个字符 s[i],检查它是否是空格。如果当前字符是空格:如果前一个字符不是空格(即 preIsBlank == False),则说明遇到了一个新的段,因此 sum 增加 1,将 preIsBlank 设置为 True,表示当前字符是空格。如果当前字符不是空格:将 preIsBlank 设置为 False,表示当前字符不是空格。

返回结果:最终返回 sum,即字符串中的段数。

len(): 返回对象的长度或元素的数量

参数描述
obj要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。

range(): Python 中的一个内置函数,用于生成一个整数序列。它通常用于 for 循环中,以便迭代一系列的数字。range() 函数可以接收一个、两个或三个参数,以不同方式生成整数序列

参数名描述默认值示例
start序列的起始值(包含)0range(2, 5) 生成 [2, 3, 4]
stop序列的结束值(不包含)range(5) 生成 [0, 1, 2, 3, 4]
step步长,即每次递增或递减的值1range(0, 10, 2) 生成 [0, 2, 4, 6, 8]
class Solution:
    def countSegments(self, s: str) -> int:
        n = len(s)
        preIsBlank = False
        sum = 0
        for i in range(n):
            if s[i] == " ":
                if preIsBlank == False:
                    sum += 1
                preIsBlank = True
            else: 
                preIsBlank = False
        return sum
                 


方法二、split函数分割

思路与算法

字符串分割:使用 split() 方法将字符串 s 按照空白字符(如空格、制表符、换行符等)分割成多个片段。split() 方法默认以空白字符为分隔符,并自动忽略连续的空白字符。例如,"Hello, world!" 会被分割为 ['Hello,', 'world!']。​

片段计数:通过 len() 函数统计分割后列表的长度,即为单词(片段)的数量。例如,['Hello,', 'world!'] 的长度为 2

split():Python中用于字符串处理的一个重要方法,其主要作用是根据指定的分隔符将字符串分割成多个子字符串,并将这些子字符串存储在一个列表中返回。

参数作用
sep分隔符,默认为None,表示使用空格作为分隔符。可以指定其他字符或字符串作为分隔符。
maxsplit最大分割次数,默认为-1,表示不限制分割次数。如果指定为正整数,则最多分割maxsplit次。

len(): 返回对象的长度或元素的数量

参数描述
obj要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。
class Solution:
    def countSegments(self, s: str) -> int:
        return len(s.split())


3.1704. 判断字符串的两半是否相似

给你一个偶数长度的字符串 s 。将其拆分成长度相同的两半,前一半为 a ,后一半为 b 。

两个字符串 相似 的前提是它们都含有相同数目的元音('a''e''i''o''u''A''E''I''O''U')。注意,s 可能同时含有大写和小写字母。

如果 a  b 相似,返回 true ;否则,返回 false 。

示例 1:

输入:s = "book"
输出:true
解释:a = "bo" 且 b = "ok" 。a 中有 1 个元音,b 也有 1 个元音。所以,a 和 b 相似。

示例 2:

输入:s = "textbook"
输出:false
解释:a = "text" 且 b = "book" 。a 中有 1 个元音,b 中有 2 个元音。因此,a 和 b 不相似。
注意,元音 o 在 b 中出现两次,记为 2 个。

方法一、分别遍历字符串的前后部分

算法和思路

长度检查:首先检查字符串的长度是否为偶数。如果不是偶数,直接返回 False,因为无法将字符串平分成两半。

统计元音字母:遍历字符串的前半部分,统计元音字母的数量,并将结果累加到 count 中。遍历字符串的后半部分,统计元音字母的数量,并从 count 中减去。

判断结果:如果 count 最终为 0,说明前后两半的元音字母数量相同,返回 True;否则返回 False

len(): 返回对象的长度或元素的数量

参数描述
obj

要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。

range():  Python 中的一个内置函数,用于生成一个整数序列。它通常用于 for 循环中,以便迭代一系列的数字。range() 函数可以接收一个、两个或三个参数,以不同方式生成整数序列

参数名描述默认值示例
start序列的起始值(包含)0range(2, 5) 生成 [2, 3, 4]
stop序列的结束值(不包含)range(5) 生成 [0, 1, 2, 3, 4]
step步长,即每次递增或递减的值1range(0, 10, 2) 生成 [0, 2, 4, 6, 8]
class Solution:
    def isYuanYin(self, s):
        return s in ('a','e','i','o','u','A','E','I','O','U')

    def halvesAreAlike(self, s: str) -> bool:
        n = len(s)
        if n % 2 == 1:
            return False
        count = 0
        for i in range(n // 2):
            if self.isYuanYin(s[i]):
                count += 1
            
        for i in range(n // 2, n):
            if self.isYuanYin(s[i]):
                count -= 1
        return count == 0


方法二、一行代码

sum():用于计算可迭代对象(如列表、元组、集合等)中所有元素的和。它还可以接受一个可选的起始值,表示求和的初始值。

参数名类型描述
iterable可迭代对象必需参数,表示要进行求和操作的可迭代对象(如列表、元组、集合等)。
start数字(可选)可选参数,表示求和的起始值,默认为0。

set():用于创建一个集合。集合是一个无序且不重复的元素集,常用于去重、成员测试和集合运算(如并集、交集、差集等)。

参数名类型描述
iterable可迭代对象可选参数,表示要转换为集合的可迭代对象(如列表、元组等)。

len(): 返回对象的长度或元素的数量

参数描述
obj要计算长度的对象。可以是字符串、列表、元组、字典、集合等可迭代对象。

列表推导式:Python中一种简洁且高效的语法,用于从一个可迭代对象(如列表、元组、字符串等)中快速生成新的列表。语法:[expression for item in iterable if condition]

  • expression 是对 item 执行的操作或表达式,生成新列表中的元素。
  • item 是从 iterable 中遍历的每一个元素。
  • iterable 是可迭代对象(如列表、元组、字符串等)。
  • if condition 是可选的条件判断,只有满足条件的 item 才会被处理。
class Solution:

    def halvesAreAlike(self, s: str) -> bool:
        return sum(i in set('aeiouAEIOU') for i in s[:len(s)//2]) == sum(j in set('aeiouAEIOU')  for j in s[len(s)//2:])

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机视觉cv2入门之图像的读取,显示,与保存

在计算机视觉领域&#xff0c;Python的cv2库是一个不可或缺的工具&#xff0c;它提供了丰富的图像处理功能。作为OpenCV的Python接口&#xff0c;cv2使得图像处理的实现变得简单而高效。 示例图片 目录 opencv获取方式 图像基本知识 颜色空间 RGB HSV 图像格式 BMP格式 …

LLM 学习(二 完结 Multi-Head Attention、Encoder、Decoder)

文章目录 LLM 学习&#xff08;二 完结 Multi-Head Attention、Encoder、Decoder&#xff09;Self-Attention &#xff08;自注意力机制&#xff09;结构多头注意力 EncoderAdd & Norm 层Feed Forward 层 EncoderDecoder的第一个Multi-Head AttentionMasked 操作Teacher Fo…

006-获取硬件序列号

获取硬件序列号 我将从跨平台角度系统讲解如何通过C获取硬件序列号的核心技术&#xff0c;并提供可移植性代码实现。 一、处理器序列号获取 Windows平台 #include <windows.h> #include <intrin.h>std::string GetCPUSerial_Win() {DWORD cpuInfo[2] { 0 };__c…

GDB调试技巧:多线程案例分析(保姆级)

在软件开发的复杂世界里&#xff0c;高效的调试工具是解决问题的关键利器。今天&#xff0c;我们将深入探讨强大的调试工具 ——GDB&#xff08;GNU Debugger&#xff09;。GDB 为开发者提供了一种深入程序内部运行机制、查找错误和优化性能的有效途径。让我们一同开启 GDB 的调…

OSPF的各种LSA类型,多区域及特殊区域

一、OSPF的LSA类型 OSPF&#xff08;开放最短路径优先&#xff09;协议使用多种LSA&#xff08;链路状态通告&#xff09;类型来交换网络拓扑信息。以下是主要LSA类型的详细分类及其作用&#xff1a; 1. Type 1 LSA&#xff08;路由器LSA Router LSA&#xff09; 生成者&…

JavaScript系列06-深入理解 JavaScript 事件系统:从原生事件到 React 合成事件

JavaScript 事件系统是构建交互式 Web 应用的核心。本文从原生 DOM 事件到 React 的合成事件&#xff0c;内容涵盖&#xff1a; JavaScript 事件基础&#xff1a;事件类型、事件注册、事件对象事件传播机制&#xff1a;捕获、目标和冒泡阶段高级事件技术&#xff1a;事件委托、…

字节跳动C++客户端开发实习生内推-抖音基础技术

智能手机爱好者和使用者&#xff0c;追求良好的用户体验&#xff1b; 具有良好的编程习惯&#xff0c;代码结构清晰&#xff0c;命名规范&#xff1b; 熟练掌握数据结构与算法、计算机网络、操作系统、编译原理等课程&#xff1b; 熟练掌握C/C/OC/Swift一种或多种语言&#xff…

MySQL进阶-关联查询优化

采用左外连接 下面开始 EXPLAIN 分析 EXPLAIN SELECT SQL_NO_CACHE * FROM type LEFT JOIN book ON type.card book.card; 结论&#xff1a;type 有All ,代表着全表扫描&#xff0c;效率较差 添加索引优化 ALTER TABLE book ADD INDEX Y ( card); #【被驱动表】&#xff0…

ai之qwq 32B部署在 linux 与拓展使用在web参考

linux部署 Linux 命令行&#xff1a; curl -fsSL https://ollama.com/install.sh | sh2 将Ollama设置为系统启动时自动运行&#xff08;建议&#xff09; 创建系统用户和用户组 sudo useradd -r -s /bin/false -U -m -d /usr/share/ollama ollamasudo usermod -a -G ollama $…

景联文科技:以精准数据标注赋能AI进化,构筑智能时代数据基石

在人工智能技术席卷全球的浪潮中&#xff0c;高质量数据已成为驱动AI模型进化的核心燃料。作为全球领先的AI数据服务解决方案提供商&#xff0c;景联文科技深耕数据标注领域多年&#xff0c;以技术为基、以专业为本&#xff0c;致力于为全球客户提供全场景、高精度、多模态的数…

C语言_数据结构总结4:不带头结点的单链表

纯C语言代码&#xff0c;不涉及C 0. 结点结构 typedef int ElemType; typedef struct LNode { ElemType data; //数据域 struct LNode* next; //指针域 }LNode, * LinkList; 1. 初始化 不带头结点的初始化&#xff0c;即只需将头指针初始化为NULL即可 void Init…

IDEA 基础配置: maven配置 | 服务窗口配置

文章目录 IDEA版本与MAVEN版本对应关系maven配置镜像源插件idea打开服务工具窗口IDEA中的一些常见问题及其解决方案IDEA版本与MAVEN版本对应关系 查找发布时间在IDEA版本之前的dea2021可以使用maven3.8以及以前的版本 比如我是idea2021.2.2 ,需要将 maven 退到 apache-maven-3.…

【单片机】ARM 处理器简介

ARM 公司简介 ARM&#xff08;Advanced RISC Machine&#xff09; 是英国 ARM 公司&#xff08;原 Acorn RISC Machine&#xff09; 开发的一种精简指令集&#xff08;RISC&#xff09; 处理器架构。ARM 处理器因其低功耗、高性能、广泛适用性&#xff0c;成为嵌入式系统、移动…

DeepSeek+知识库+鸿蒙,助力鸿蒙高效开发

不知道你们发现没有&#xff0c;就是鸿蒙开发官网&#xff0c;文档也太多太多了&#xff0c;对于新手来说确实头疼&#xff0c;开发者大多是极客&#xff0c;程序的目的是让世界更高效&#xff01;看文档&#xff0c;挺头疼的&#xff0c;毕竟都是理科生。 遇到问题不要慌&…

第十五届蓝桥杯省赛电子类单片机学习过程记录(客观题)

客观试题: 01.典型的BUCK电源电路包含哪些关键器件(ABCD) A. 电容 B. 二极管 C. 电感 D. MOSFET 解析: 典型的 BUCK 电源电路是一种降压型的直流-直流转换电路,它包含以下关键器件: A.电容:电容在电路中起到滤波的作用。输入电容用于平滑输入电压的波动,减少电源噪声对…

uniapp uniCloud引发的血案(switchTab: Missing required args: “url“)!!!!!!!!!!

此文章懒得排版了&#xff0c;为了找出这个bug, 星期六的晚上我从9点查到0点多&#xff0c;此时我心中一万个草泥马在崩腾&#xff0c;超级想骂人&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; uniCloud 不想…

源码:用Python进行电影数据分析实战指南

源码&#xff1a;用Python进行电影数据分析实战指南 原创 IT小本本 IT小本本 2025年03月03日 22:28 北京 接上一篇文章&#xff1a;用Python进行电影数据分析实战指南 1、首先复制csv内容到csv文件中 2、接着创建.py文件复制源码内容 3、运行代码&#xff0c;就可以看到数据…

GHCTF2025--Web

upload?SSTI! import os import refrom flask import Flask, request, jsonify,render_template_string,send_from_directory, abort,redirect from werkzeug.utils import secure_filename import os from werkzeug.utils import secure_filenameapp Flask(__name__)# 配置…

Unity Shader编程】之基础纹理

一&#xff0c;单张纹理 好的&#xff0c;用户想学习Unity Shader中的单张纹理章节。我需要根据提供的搜索结果来整理相关内容。首先&#xff0c;查看搜索结果中的相关部分&#xff0c;特别是‌、‌、‌、‌、‌这几条&#xff0c;因为它们提到了基础纹理、单张纹理的实现方法…

SpringBoot使用注解扫描注册Java Web三大组件

使用注解扫描和注册Java Web三大组件&#xff08;Servlet、Filter、Listener&#xff09;非常方便。 1. Servlet 注册 Servlet 是 Java Web 开发的基础组件&#xff0c;用于处理客户端&#xff08;通常是浏览器&#xff09;发送的 HTTP 请求并生成响应。 Controller是基于 Ser…