二刷力扣--字符串
字符串
摘自Python文档-标准库:
在Python中, 字符串是由 Unicode 码位构成的不可变序列。
由于不存在单独的“字符”类型,对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说,对于一个非空字符串 s, s[0] == s[0:1]。
不存在可变的字符串类型,但是 str.join() 或 io.StringIO 可以被被用来根据多个片段高效率地构建字符串。
字符串常用方法:
- 查找子串
str.find(_sub_[, _start_[, _end_]])
返回子字符串 sub 在s[start:end]切片内被找到的最小索引。 可选参数 start 与 end 会被解读为切片表示法。 如果 sub 未被找到则返回-1 - 拼接字符串
str.join(_iterable_)
返回一个由 iterable 中的字符串拼接而成的字符串。 如果 iterable 中存在任何非字符串值包括bytes对象则会引发TypeError。 调用该方法的字符串将作为元素之间的分隔。 - 切割字符串
str.split(_sep=None_, _maxsplit=- 1_)
返回一个由字符串内单词组成的列表,使用 sep 作为分隔字符串。 如果给出了 maxsplit,则最多进行 maxsplit 次拆分(因此,列表最多会有maxsplit+1个元素)。 如果 maxsplit 未指定或为-1,则不限制拆分次数(进行所有可能的拆分)。 - 去除前导和末尾字符
str.strip([_chars_])
返回原字符串的副本,移除其中的前导和末尾字符。 chars 参数为指定要移除字符的字符串。 如果省略或为None,则 chars 参数默认移除空白符。 实际上 chars 参数并非指定单个前缀或后缀;而是会移除参数值的所有组合。
344.反转字符串
输入的字符串反转过来。输入字符串以字符数组 s 的形式给出。
#双指针
class Solution:def reverseString(self, s: List[str]) -> None:"""Do not return anything, modify s in-place instead."""n = len(s)for i in range(n // 2):s[i], s[n - i - 1] = s[n - i - 1], s[i]
python中最简单的反转是用 `[::-1]
541. 反转字符串 II
#模拟
给定一个字符串 s 和一个整数 k,从字符串开头算起,每计数至 2k 个字符,就反转这 2k 字符中的前 k 个字符。
- 如果剩余字符少于
k个,则将剩余字符全部反转。 - 如果剩余字符小于
2k但大于或等于k个,则反转前k个字符,其余字符保持原样。
按照题意,模拟。
class Solution:def reverseStr(self, s: str, k: int) -> str:right = 2*kn = len(s)res = ""while right <= n: res += s[right-2*k:right-k][::-1] + s[right-k:right]right += 2*kright -= 2*kif n - len(res) < k:res += s[right:][::-1]elif n-len(res)>= k:res += s[right:right+k][::-1] + s[right+k:]return res
可以借助Python切片特性简化:
class Solution:def reverseStr(self, s: str, k: int) -> str:p = 0while p < len(s):p2 = p + ks = s[:p] + s[p: p2][::-1] + s[p2:]p = p + 2 * kreturn s
剑指 Offer 05. 替换空格
请实现一个函数,把字符串 s 中的每个空格替换成"%20"。
class Solution:def replaceSpace(self, s: str) -> str:res = ""for c in s:if c == " ":res += "%20"else:res += creturn res
151. 反转字符串中的单词
给你一个字符串 s ,请你反转字符串中 单词 的顺序。
class Solution:def reverseWords(self, s: str) -> str:s = [x for x in s.split(" ") if x != ''] return " ".join(s[::-1])
剑指 Offer 58 - II. 左旋转字符串
字符串的左旋转操作是把字符串前面的若干个字符转移到字符串的尾部。请定义一个函数实现字符串左旋转操作的功能。比如,输入字符串"abcdefg"和数字2,该函数将返回左旋转两位得到的结果"cdefgab"。
class Solution:def reverseLeftWords(self, s: str, n: int) -> str:s = s[n:] + s[:n]return s
28. 找出字符串中第一个匹配项的下标
给你两个字符串 haystack 和 needle ,请你在 haystack 字符串中找出 needle 字符串的第一个匹配项的下标(下标从 0 开始)。如果 needle 不是 haystack 的一部分,则返回 -1 。
最简单的是直接遍历:
class Solution:def strStr(self, haystack: str, needle: str) -> int:n = len(haystack)left = 0right = len(needle)if right == 0:return 0while right <= n:if haystack[left: right] == needle:return leftleft += 1right += 1return -1
或者选择进入KMP:
KMP算法名字由发明它的三个人的名字组成,解决字符串的匹配问题。
假设在字符串s中匹配模板t
s:aabaabaaf
t:aabaaf
前缀和后缀:即字符串的一部分。
前缀即a, aa, aab, aaba, aabaa
后缀即f, af, aaf, baaf, abaaf
最长相等前后缀(前缀表next)

利用前缀表,当匹配失败的时候,可以跳到下一个匹配的位置。(本例中,aabaaf匹配失败时,找aabaa的前缀表,得到2,于是下一个匹配b。
class Solution:def getNext(s):next = [0] * len(s)j = 0 # j代表前缀末尾next[j] = 0for i in range(1,len(s)): # i代表后缀末尾while j > 0 and s[i] != s[j]:# 不等时回退jj = next[j-1]if s[i] == s[j]: # 相等时, j+1j += 1next[i] = jreturn nextdef strStr(self, haystack: str, needle: str) -> int:if len(needle) == 0:return 0next = Solution.getNext(needle)j = 0for i in range(len(haystack)):while j > 0 and haystack[i] != needle[j]:j = next[j-1]if haystack[i] == needle[j]:j += 1if j == len(needle):return i-len(needle)+1 return -1
getNext的
j=next[j-1]那里不是特别明白,但是背下来了。
next[j]就是记录着j(包括j)之前的子串的相同前后缀的长度。
重复的子字符串
给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。
- 暴力
class Solution:def repeatedSubstringPattern(self, s: str) -> bool:n = len(s)if n <= 1:return Falsesubstr = ""for i in range(1, n//2 + 1):if n % i == 0:substr = s[:i]if substr * (n//i) == s:return Truereturn False
- find
如果s由重复子串组成,那么两个s拼接在一起,中间肯定会再出现一个s。
(当然这只说明了必要性,还要证明充分性。)
class Solution:def repeatedSubstringPattern(self, s: str) -> bool:n = len(s)if n <= 1:return Falsess = s[1:] + s[:-1] return ss.find(s) != -1
字符串小结
字符串简单的题很简单,就是双指针、模拟,主要考察对字符串的基本操作。
复杂的会涉及到KMP(在s中找t)。虽然有库函数(find)可以实现这个过程。
相关文章:
二刷力扣--字符串
字符串 摘自Python文档-标准库: 在Python中, 字符串是由 Unicode 码位构成的不可变序列。 由于不存在单独的“字符”类型,对字符串做索引操作将产生一个长度为 1 的字符串。 也就是说,对于一个非空字符串 s, s[0] s[0:1]。 不存…...
如何将 OBJ 模型转换和压缩为 GLTF 以与 AWS IoT TwinMaker 配合使用
推荐:使用NSDT场景编辑器快速搭建3D应用场景 概述 在这篇博文中,引用了几种文件扩展名和模型格式。在开始之前,最好了解以下内容: OBJ – 对象文件,一种标准的 3D 图像格式,可以通过各种 3D 图像编辑程序…...
零基础学前端(四)重点讲解 CSS
1. 该篇适用于从零基础学习前端的小白 2. 初学者不懂代码得含义也要坚持模仿逐行敲代码,以身体感悟带动头脑去理解新知识 3. 初学者切忌,不要眼花缭乱,不要四处找其它文档,要坚定一个教授者的方式,将其学通透ÿ…...
类和对象【初始化列表与友元】
全文目录 初始化列表特性 explicit关键字static成员特性 友元友元函数友元类内部类特性 初始化列表 构造函数体中的语句只能将其称为赋初值,而不能称作初始化。因为初始化只能初始化一次,而构造函数体内可以多次赋值。 对象的初始化是在初始化列表进行…...
ActiveRecord::Migration.maintain_test_schema!
测试gem: rspec-rails 问题描述 在使用 rspec-rails 进行测试时,出现了以下错误 ActiveRecord::StatementInvalid: UndefinedFunction: ERROR: function init_id() does not exist这个错误与数据库架构有关。 schema.rb中 create_table "users…...
逆向-beginners之helloworld
#include <stdio.h> int _main() { printf("hello world.\n"); return 0; } // 上面的代码等效于: char *SG3830[] {"hello, world\n"}; int main() { printf("%s", *SG3830); return 0; } #if 0 /* * i…...
如何微调甜甜圈模型——使用示例
Python 中的 Donut 模型可用于从给定图像中提取文本。这在各种场景中都很有用,例如扫描收据。 您可以轻松地。但与人工智能模型一样,您应该根据您的特定需求微调模型。 我编写本教程是因为我没有找到任何资源来准确展示如何使用我的数据集微调 Donut 模型。因此,我必须从其…...
小程序中如何查看指定会员的付款记录
在小程序中,我们可以通过一些简单的步骤来查看指定会员的付款记录。下面是具体的操作流程: 1. 找到指定的会员卡。在管理员后台->会员管理处,找到需要查看付款记录的会员卡。也支持对会员卡按卡号、手机号和等级进行搜索。 2. 查看会员卡…...
LeetCode_贪心算法_困难_630.课程表 III
目录 1.题目2.思路3.代码实现(Java) 1.题目 这里有 n 门不同的在线课程,按从 1 到 n 编号。给你一个数组 courses ,其中 courses[i] [durationi, lastDayi] 表示第 i 门课将会持续上 durationi 天课,并且必须在不晚于…...
Drozer安装
Drozer安装包下载 https://labs.withsecure.com/tools/drozer Drozer需要的python包下载 pip install "pip<21.0" pyOpenSSL pip install "pip<21.0" service_identity pip install "pip<21.0" twisted pip install "pip<…...
752. 打开转盘锁
链接: 752. 打开转盘锁 题解: class Solution { public:int openLock(vector<string>& deadends, string target) {std::unordered_set<std::string> table(deadends.begin(), deadends.end());if (table.find("0000") ! t…...
Bearly:基于人工智能的AI写作文章生成工具
【产品介绍】 名称 Bearly 具体描述 Bearly是一个AI人工智能内容创作工具。你可以用Bearly来阅读、写作、创作,提高你的效率。包括使用Bearly来生成网页的摘要、标题、关键点,也可以用Bearly来生成创意内容、艺术图片、文案编辑等。帮助你克…...
详解哈希,理解及应用
全文目录 概念哈希冲突及原因解决哈希冲突的方法闭散列线性探测二次探测扩容 开散列扩容 哈希的应用位图布隆过滤器 概念 通过映射关系将关键字映射到存储位置,并实现增删改查操作。 通过上面的方法构造出来的结构就叫哈希表(散列表)&#x…...
解决js加减乘除精度丢失问题
公共类, 将科学计数法的数字转为字符串(以下加减乘除依赖该方法) var toNonExponential (num)> {if(num null) {return num;}if(typeof num "number") {var m num.toExponential().match(/\d(?:\.(\d*))?e([-]\d)/);return num.toFixed(Math.max(0, (m[1] …...
八股——const 关键字
1.const作用 作用:const用于保护指针指向数据不被修改 测试代码1 显示数组的函数不小心修改了指针指向的值,这时候没有加const关键字,编译器不会报错 #include <stdio.h> void showar(int ar[]);int main(void) {int ar[4]{2,3,4,5…...
QT object元对象
qt中的元对象系统提供了对象间通信的信号和槽机制、运行时类型 信息和动态属性系统; 1.该类必须继承自QObject类; 2.必须在类的私有声明区声明Q_OBJECT宏(在类定义时,如果没有指定,public或private,则默认为private&a…...
互斥锁,条件变量,信号量的三个小demo
仨demo 一、 一个线程读文件,另一个线程将读取的内容输出到终端 1.1 要求 创建两个线程,其中一个线程读取文件中的数据,另外一个线程将读取到的内容打印到终端上,类似实现cat一个文件。 cat数据完毕后,要结束两个线…...
【UE 材质】力场护盾和冲击波效果
目录 效果 步骤 一、制作力场护盾材质 二、制作冲击波材质效果 三、制作冲击波粒子效果 四、制作震动效果 效果 步骤 一、制作力场护盾材质 1. 首先新建一个第一人称角色游戏模板 2. 新建一个材质,用于作为力场护盾的材质,这里命名为“Mat_for…...
类和对象三大特性之多态
全文目录 虚函数虚函数的重写接口继承和实现继承重载、重写(覆盖)、隐藏(重定义)C11 override 和 final抽象类 多态的概念多态原理虚函数表 单继承和多继承的虚函数表打印虚函数表单继承的虚函数表多继承的虚函数表 常见面试问答题…...
为何红黑树在B/B+树之上仍然占据重要地位?
为何红黑树在B/B树之上仍然占据重要地位? 引言二、红黑树和B/B树的基本原理2.1、红黑树的特点和性质2.2、B/B树的特点和性质2.3、红黑树和B/B树的比较 三、B/B树相对于红黑树的优势四、红黑树仍然占据重要地位的原因总结 博主简介 💡一个热爱分享高性能服…...
Oracle推出Java验证组合产品 简化开发者工具管理
Oracle宣布推出Java验证组合产品(JVP),为开发者提供由Oracle支持的精选工具、库、框架和服务集合。JVP发布时包含的资产包括基于Java的UI框架JavaFX、Microsoft Visual Studio Code编辑器的Java平台扩展,以及用于微服务的Helidon …...
GHelper:轻量级华硕笔记本性能控制工具实战指南
GHelper:轻量级华硕笔记本性能控制工具实战指南 【免费下载链接】g-helper Lightweight Armoury Crate alternative for Asus laptops. Control tool for ROG Zephyrus G14, G15, G16, M16, Flow X13, Flow X16, TUF, Strix, Scar and other models 项目地址: htt…...
FastAPI JSON序列化性能优化:为什么我最终选择了orjson?
FastAPI JSON序列化性能优化:为什么我最终选择了orjson? 当你的FastAPI应用开始处理每秒数千次请求,或者需要序列化包含数百万条记录的数据集时,JSON序列化的性能突然变得至关重要。我曾经以为Python内置的json模块已经足够快——…...
光伏三相并网技术与多级逆变器:高效功率输出与稳定直流母线电压控制策略仿真研究
光伏三相并网: 1.光伏10kwMPPT控制两级式并网逆变器(boost三相桥式逆变) 2.坐标变换锁相环dq功率控制解耦控制电流内环电压外环控制spwm调制 3.LCL滤波 仿真结果: 1.逆变输出与三项380V电网同频同相 2.直流母线电压800V稳定 3.d轴…...
从零玩转ZYNQ定时器:全局定时器vs私有定时器,5个你必须要知道的性能陷阱
ZYNQ定时器深度解析:全局定时器与私有定时器的实战应用指南 1. ZYNQ定时器架构全景剖析 在ZYNQ嵌入式系统中,定时器资源堪称"瑞士军刀"般多功能。每个Cortex-A9处理器都配备专属的32位私有定时器和看门狗定时器,而双核共享的64位全…...
Phi-3-Mini-128K大模型快速部署教程:3步完成Ubuntu环境搭建
Phi-3-Mini-128K大模型快速部署教程:3步完成Ubuntu环境搭建 想试试微软最新开源的Phi-3-Mini-128K模型,但被复杂的部署步骤劝退?别担心,这篇教程就是为你准备的。我最近刚在Ubuntu系统上折腾完,发现其实没那么复杂&am…...
FireRedASR Pro快速上手:支持GPU加速,识别速度大幅提升
FireRedASR Pro快速上手:支持GPU加速,识别速度大幅提升 1. 项目概述 FireRedASR Pro是一款基于工业级语音识别模型开发的本地化ASR工具,特别针对中文语音识别场景进行了优化。该工具通过深度集成pydub音频处理流水线,解决了传统…...
液晶接口系列——MIPI(四)DSI信号完整性测试与优化实战
1. DSI信号完整性测试的核心挑战 第一次用示波器抓取MIPI DSI信号时,我盯着屏幕上扭曲的波形愣了半天——这和教科书上完美的眼图相差十万八千里。后来才发现,当信号速率超过1Gbps时,哪怕PCB走线多绕了5mm,都会导致明显的信号劣化…...
基于单片机的自动门系统(有完整资料)
资料查找方式:特纳斯电子(电子校园网):搜索下面编号即可编号:T1552204C设计简介:本设计是基于单片机的自动门系统,主要实现以下功能:1.利用红外线感应器和温度传感器准确的收集数据。…...
2026 学术生产力革命:9 大 AI 论文工具实测,解锁本科论文全流程通关密码
引言:学术写作进入 AI 协同时代,效率与合规双突破 在 2026 年的高校校园里,本科毕业论文写作正经历着一场深刻的变革。曾经让无数学生熬夜苦读、反复修改的 “毕业大考”,如今因 AI 技术的普及变得愈发高效可控。面对选题构思无头…...
