【学习笔记】字符串(遍历+反转+替换+子串匹配+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,给字符串留出足够的空间,不会溢出。

相关推荐
大模型码小白25 分钟前
MCP协议开发实战:从零搭建AI Agent工具链
运维·人工智能·算法·机器学习·自动化
luj_176834 分钟前
断舍离中的项目管理智慧
c语言·开发语言·c++·经验分享·算法
老王爱玩车39 分钟前
关于函数递归的优缺点分析
开发语言·数据结构·学习·算法
无限码力1 小时前
拼多多 春招&秋招 笔试真题题库目录|笔试题库 + 算法考点详解
算法·pdd笔试真题·pdd笔试真题题解·拼多多春招笔试真题·拼多多秋招笔试真题·拼多多笔试真题题解
春风解人意1 小时前
从零开始学习嵌入式P30----进程间的通信
c语言·学习
OPEN-F1 小时前
C++进阶教程:文件流与字符串流
开发语言·c++·算法
日拱一卒的小田1 小时前
ZYNQ学习笔记3-ZYNQ的IIC控制器3
笔记·学习
维克兜率天1 小时前
4.1.3 策略类型全景图:六大策略,你适合哪个
笔记·python·算法·量化
01_ice1 小时前
c++类和对象(中)
c++·算法