- C++
C++ 字符串操作与算法实践学习笔记
- 2025-7-19 9:49:55 @
C++ 字符串操作与算法实践学习笔记
一、前言
本次课程围绕 C++ 字符串操作和简单算法展开,涵盖数组排序、字符串查找、循环移位、构造与修改等知识点,结合代码示例与题目实践,帮助大家掌握基础用法,解决实际编程问题 。
二、数组排序实践(sort 函数)
1. 代码示例
#include <iostream>
// 引入算法库,使用 sort 排序函数
#include <algorithm>
using namespace std;
int main() {
// 定义数组存储输入整数,最多存 3000 个
int arr[3000];
int n;
// 输入整数个数
cin >> n;
for (int i = 0; i < n; i++) {
// 循环读入 n 个整数到数组
cin >> arr[i];
}
// 对数组前 n 个元素升序排序,sort(起始地址, 结束地址),结束地址不包含
sort(arr, arr + n);
for (int i = 0; i < n; i++) {
// 输出排序后数组元素,空格分隔
cout << arr[i] << " ";
}
return 0;
}
2. 关键说明
- sort 函数:来自
<algorithm>
库,sort(arr, arr + n)
对数组arr
从下标0
到n - 1
的元素排序,遵循左闭右开原则(arr + n
是最后一个元素下标的后一位,不参与排序 )。若数组下标从1
开始,需写成sort(arr + 1, arr + n + 1)
。 - 应用场景:处理需要排序的整数数组,比如成绩排序、数据统计前预处理等。
三、字符串基础操作(查找、截取、构造 )
1. 字符串查找与截取示例
#include<iostream>
// 引入字符串处理相关功能
#include<string>
using namespace std;
int main() {
// 定义两个字符串
string s1 = "hiheokok111o", s2 = "ok";
// 查找 s2 在 s1 中首次出现位置,找不到返回 string::npos
int pos = s1.find(s2);
cout << "s2在s1中的位置:" << pos << endl;
// 从 s1 下标 5 开始找 s2
int pos2 = s1.find(s2, 5);
cout << "s2在s1中的第二个位置:" << pos2 << endl;
string s3 = "ohell";
// 截取 s3 从下标 1 开始到末尾的子串,拼接下标 0 的字符,实现类似“循环移位”
s3 = s3.substr(1) + s3[0];
cout << s3 << endl;
return 0;
}
2. 字符串构造示例
#include<iostream>
using namespace std;
int main() {
// 字符串常量(C 风格,本质是 const char* )与 string 类型区分说明
// 用构造函数初始化 string 对象
// string s3("World");
// 构造匿名 string 对象并输出
cout << string("World") << endl;
return 0;
}
3. 关键说明
- find 函数:
string
类成员函数,s.find(sub, pos)
在字符串s
中,从下标pos
开始找子串sub
,找到返回起始下标,找不到返回string::npos
(常用来判断查找结果 )。 - substr 函数:
s.substr(pos, len)
截取字符串s
从下标pos
开始,长度为len
的子串;若省略len
,截取到字符串末尾 。 - 构造函数:
string("内容")
可直接创建匿名字符串对象,也能用string s("内容")
定义命名对象,用于快速初始化字符串 。
四、字符串循环移位与子串包含问题(算法实践 )
1. 题目:字串包含(信息学奥赛一本通 2050 )
- 题目描述:给定两个字符串,判定一个是否是另一个经若干次循环移位(把第一个字符移到末尾)后的新字符串的子串,是则输出
true
,否则false
。 - 代码实现:
#include<bits/stdc++.h>
using namespace std;
int main() {
string s1, s2;
// 输入两个字符串
cin >> s1 >> s2;
// 保证 s1 是较长或等长的字符串,方便后续处理
if (s2.size() > s1.size()) {
swap(s1, s2);
}
// 循环移位次数最多为 s1 长度(移位 s1.size() 次会回到原字符串 )
for (int i = 1; i <= (int)s1.size(); i++) {
// 检查 s2 是否是当前 s1 的子串
if (s1.find(s2, 0) != string::npos) {
cout << "true" << endl;
return 0;
}
// 对 s1 进行一次循环移位:截取下标 1 到末尾,拼接下标 0 字符
s1 = s1.substr(1) + s1[0];
}
// 循环结束没找到,输出 false
cout << "false" << endl;
return 0;
}
2. 关键说明
- 循环移位逻辑:通过
s1 = s1.substr(1) + s1[0]
实现,每次把第一个字符移到末尾,模拟循环移位操作 。 - 子串判断:借助
find
函数检查子串,结合循环移位覆盖所有可能的移位情况,判断是否满足题目条件 。
五、字符串的增删改查扩展(insert、replace )
1. 代码示例
#include<iostream>
using namespace std;
int main() {
string s = "Hello";
// 在 s 下标 1 位置插入子串 "ello" ,原字符串变为 "Hellowello"
s.insert(1, "ello");
// // 从下标 1 开始,替换 3 个字符为 "i" ,若取消注释,字符串会变为 "Hioello"
// s.replace(1, 3, "i");
cout << s << endl;
return 0;
}
2. 关键说明
- insert 函数:
s.insert(pos, sub)
在字符串s
下标pos
位置插入子串sub
,可用于动态扩展字符串内容 。 - replace 函数:
s.replace(pos, len, sub)
从下标pos
开始,替换len
长度的字符为子串sub
,灵活修改字符串部分内容 。
六、总结
本次课程学习了:
- 用
sort
函数对数组排序,掌握其参数规则适配不同下标起始情况 。 - 字符串的查找(
find
)、截取(substr
)、构造,以及循环移位实践,解决子串包含问题 。 - 字符串的插入(
insert
)、替换(replace
)等修改操作,丰富字符串处理手段 。这些知识是 C++ 编程基础,后续可结合更多算法题(如字符统计、密码处理等 )深化应用,多练习才能熟练掌握!
0 条评论
目前还没有评论...