【学习笔记】字符串(遍历+反转+替换+子串匹配+KMP)+题目解析

一、字符串遍历

字符串是由多个字符组成的有序字符序列,本质上是字符数组。字符串遍历就是逐个访问字符串中的每一个字符,是所有字符串操作的基础。

主流遍历方式分为三种:

1、下标遍历:通过索引 0~len(s)-1 逐个取值,支持正序、逆序遍历,灵活度最高。

2、迭代遍历:直接 for char in s 遍历所有字符,代码简洁,无需下标。

3、双指针遍历:定义左、右指针,从两端向中间遍历,常用于反转、回文判断、区间匹配。

重点:

1、字符串不可变性(Python/Java):不能直接修改指定下标字符,必须转为列表操作。

2、边界处理:空字符串、单个字符、首尾特殊字符(空格、符号)。

3、双指针遍历是字符串刷题核心技巧,适配绝大多数中等难度字符串题目。

二、字符串反转

字符串反转是将字符串的字符顺序完全倒置。

常见实现方式:切片反转、双指针交换(左右指针相向移动,交换对应字符,时间复杂度最优)、遍历倒序拼接:从最后一个字符向前遍历,逐个拼接。

重点:

1、区分整体反转单词反转

2、反转时需处理多余空格、首尾空格、单词间隔空格的场景。

3、算法核心:双指针原地反转,空间复杂度 O(1)

三、字符串替换

字符串替换是将字符串中指定的目标字符/子串,替换为自定义新字符/子串,分为单字符替换多字符/子串替换

基础原理:遍历字符串,匹配到目标内容后拼接新内容,无匹配则保留原内容。语言内置方法(如 replace)底层也是遍历匹配实现。

重点:

1、禁止直接原地修改字符串,必须通过拼接/列表转换实现。

2、替换空格核心考点:扩容预判、双指针倒序替换(避免多次扩容)。

3、区分全局替换、单次替换、指定位置替换的场景差异。

四、子串匹配(基础暴力匹配)

子串匹配:在主串S 中查找是否存在模式串T ,返回匹配位置或匹配结果。基础解法为暴力匹配(BF算法)

暴力匹配原理:依次以主串每个字符为起点,与模式串逐字符比对,匹配失败则主串指针回溯、模式串指针重置,直到匹配成功或遍历完毕。

缺点是数据量大时效率极第。匹配失败后指针大量回溯,产生重复对比。只适用于小规模字符串匹配,逻辑简单,易实现。

五、KMP算法

KMP 是高效子串匹配算法,全称 Knuth-Morris-Pratt,专门解决暴力匹配的回溯冗余问题,是字符串匹配的核心进阶考点。

核心:匹配失败不回溯主串指针,仅利用模式串自身的重复前缀后缀,移动模式串指针,避免重复比对,大幅提升效率。

重点:Next数组(前缀数组) Next数组作用:记录模式串中每个位置的最长相等前后缀长度,用于匹配失败时,快速确定模式串的回退位置,无需从头匹配。

题目:反转字符串中的单词

给你一个字符串 s ,反转字符串中所有单词的顺序,单词内部字符顺序不变,同时去除首尾多余空格,单词之间仅保留单个空格。

示例:

输入:"hello world"

输出:"world hello"

思路:

1、预处理:移除多余空格(首尾空格,单词中间多个空格)

2、将整个处理后的字符串整体反转

3、遍历,逐个反转每一个单词,单词遇到空格就停止反转

核心技巧:写一个区间反转函数,给起始下标,结束下标,就可以反转一段字符。

详细解析。reverse()区间反转函数.

作用:交换左右两端字符,双指针向中间靠拢,原地反转一段区间。

参数解释:*s:传入字符串数组首地址

l:左边界下标(闭区间,包含这个位置)

r:右边界下标(闭区间,包含这个位置)

循环while(l<r) 奇数长度字符串,最中间字符不需要交换。

1<r:左右指针相遇就停止,不需要交换中间那个字符(奇数长度)。

原地址修改数组,不开辟新字符串。

TrimSpace()删除多余空格函数:

双指针含义

j:读指针,负责从头到尾遍历原来字符串所有字符。

i:写指针,负责把筛选合格的字符写到数组前面,生成干净字符串。

reverseWords主循环逻辑:

1、trimSpace(s):第一步先清理掉所有多余空格。

2、len = strlen(s) 获取清理完成后字符串有效长度。

3、if(len == 0) return; 防御代码:字符串是空字符串,直接结束,防止报错。

4、reverse(s, 0, len - 1); 整体反转整个字符串

5、单词反转循环

start:标记当前单词第一个字符的下标

end:探测指针,一直向后走

当 end 走到空格位置:单词区间就是start , end‑1

反转完当前单词,start = end+1,start 跳到空格下一个位置,开启下一个单词。

main测试函数。

数组大小100,给字符串留出足够的空间,不会溢出。

相关推荐
三克的油1 小时前
java-学习1
java·开发语言·学习
j7~1 小时前
【C++微服务项目开发脚手架】(接口篇一)gflags + gtest + spdlog 接口学习笔记
c++·学习·gtest·项目开发·spdlog·gflags·c++项目微服务开发脚手架
hanlin031 小时前
刷题笔记:力扣第144题-二叉树的前序遍历
笔记·算法·leetcode
金士曼1 小时前
从规则到涌现:算法认知的三个层次
算法
彧azz1 小时前
图的最短路径:Dijkstra与Floyd算法
数据结构·笔记·学习
AgentMaster2 小时前
数据资产化落地难题:5款数据中台系统架构对比与实施记录
大数据·人工智能·算法
鹿角片ljp2 小时前
从 Kimi Cyber Reasoning 学习网络安全推理数据集:从 Reasoning SFT 到安全 Agent 数据设计
数据结构·算法
笨鸟先飞的橘猫2 小时前
系统设计复盘2026-09-18
学习
传奇开心果编程3 小时前
【Rust入门练中学】 第1课:从零开始
开发语言·学习·rust
residual_fan3 小时前
航空发动机故障诊断专用智能体(三):基于对比学习的时序特征区分方法
人工智能·算法·数据挖掘·数据分析