• 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 从下标 0n - 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 条评论

目前还没有评论...