【数据结构】【学习笔记】字符串
字符串
字符串匹配
有字符串名为s时,
TypeScript
indexOf
s.indexOf(a, b) 用来查找某个元素或子字符串 \(a\) 第一次出现的位置。
找不到时返回-1。
数组里装的是若是对象或者子数组,indexOf 找的是内存地址。
所以想根据对象的属性来找下标,应该用 arr.findIndex(item => item.name === "Alice")。
如果 \(b\) 传入了一个负数(比如 -5),字符串会非常宽容地把它当做 0(从头开始找)。
includes
s.includes(a),直接判断s中是否有a,有则返回true,无则false。
C#
s.Contains(a) 只能从头开始找,找到时返回true,失败返回false。
C++
contains
这是C++23才有的方法。
std::string::contains 方法,直接返回 bool 值(true / false)。
用法:s.contains(a)
find
C++23之前的可以用find。
.find() 如果找到了会返回下标;如果找不到,它不会返回 -1,而是会返回一个 C++ 专有的死亡标记:string::npos。
字符串截断
C#
s.Substring(a, b),获取字符串s[a...b]。- 切片语法:
s[a..^b]- 符号含义:
^倒序索引运算符,代表“从后往前数”,
特别的,^0代表数组的末尾边界(相当于 Length,通常只在切片时作为终点使用,直接访问s[^0]会报越界错误);..范围运算符,语法格式:s[起点..终点];- a为起点(包含)。
- 使用时省略开头或结尾;
- 数组也能直接用;
- 事实为提取具体的 Index 和 Range 对象:
其实 ^1 和 1..^1 在 C# 底层是两个真正的结构体类型(Index 和 Range),你可以把它们存进变量里传来传去,如:Index lastElement = ^1; Range middlePart = 1..^1; string s = "Hello"; char last = s[lastElement]; // 'o' string mid = s[middlePart]; // "ell"
- 符号含义:
字符串复读
TypeScript
直接s.repeat(n)就好。
C#
1.使用LINQ
string res = string.Concat(Enumerable.Repeat(s, n));
Enumerable.Repeat(s, n) 负责把字符串 s 像复印机一样复印出 n 份(此时它是一个集合),然后 string.Concat 负责把这 n 份合成一整串。
在现代 .NET 中,string.Concat 的执行方法:先算好 s.Length * n 的总长度,然后在堆内存里一次性开辟好对应大小的空间把字符填进去,不会产生多余的中间垃圾。
2. 经典StringBuilder
string res = new StringBuilder(s.Length * n).Insert(0, s, n).ToString();
StringBuilder 的 Insert(idx, str, count) 方法支持“把某个字符串在指定位置重复插入 count 次”。这种写法在底层直接进行了内存块的复制(Block Copy、块复制),比普通复制快。
C++
1. 提前分配内存然后加
std::string str;
// 🌟 核心:提前把内存地盘分配好,防止后续追加时发生内存重新分配
str.reserve(n * (mul));
// 复印
for (int i = 0; i < mul; ++i) {
str += a;
}
2. C++23管道流
#include <ranges>
#include <string>
std::string res = std::views::repeat(s, mul)
| std::views::join
| std::ranges::to<std::string>();
|为管道符号std::views::repeat(s, mul):在内存中生成一个虚拟视图,它把字符串 s 虚拟地重复了 mul 次。⚠️注意:此时它并没有真正去复制内存,只是复制视图。| std::views::join:repeat后结果只是集合,使用 join 把它们的所有字符横向拼在一起。| std::ranges::to<std::string>():把前面这一串虚拟的字符流,真正打包成一个 std::string 对象。
字符和数字
TypeScript
字符转数字
1. 直接和数字相加
2. Number(str)
最简单,直接全部转为number
当不是全部是数字时,转换后的结果是isNaN,可以用Number.isNaN(val)检查。
3. parseInt(str, b)
str为字符串,b为几进制,转为整数
4. parseFloat(str)
转为浮点数
数字转字符串
1. 格式化法
`${num}`,注意:符号用的反引号。
2. String(num)
将数字转字符串
3. num.toString()
直接将数字转字符串
4. num.toFixed(a)
转字符串时保留a个小数位。
拓展
str.padStart(a, b)
当字符串的长度不足a时,在前面补充b字符串。

浙公网安备 33010602011771号