以下将围绕 字符串处理 核心知识点,结合题目场景,用小学生能懂的话+代码注释,带大家复习字符串函数用法,还会拆解题目解题思路,让知识 “活” 起来 👇

一、先复习字符串基础 & 常用函数(C++ 版)

1. 字符串是什么?

可以把字符串想象成 “一串字符”,像 “abc”“hello” ,就是把单个字母 / 符号连起来,在代码里用 string 类型存 。比如:

string str = "abcde"; // 存了字符 a、b、c、d、e

2. 常用字符串函数(超简化解释)

  • size() / length() :数字符串里有几个字符。比如 “abc” 用 str.size() ,就会得到 3 ,像数小方块数量一样简单~
string str = "apple";
int len = str.size(); // len 就是 5 ,因为有 a、p、p、l、e 这 5 个字符
  • substr() :从字符串里 “截出一段” 小字符串。它有两种常用写法:
    • substr(起始下标, 长度) :从下标对应的位置,截指定长度。下标从 0 开始数!比如 “abcdef” ,substr(1, 3) 就是从第 2 个字符(下标 1 )开始,截 3 个字符,得到 “bcd” 。
    • substr(起始下标) :从起始下标开始,截到字符串末尾。比如 “abcdef” ,substr(2) 就是从下标 2(字符 c )开始,截到最后,得到 “cdef” 。
string str = "abcdefg";
// 从下标 2 开始,截 3 个字符 → "cde"
string part1 = str.substr(2, 3); 
// 从下标 4 开始,截到末尾 → "efg"
string part2 = str.substr(4); 
  • 遍历字符串 :像挨个点名一样,把每个字符看一遍。用 for 循环,结合 size() 就能实现:
string str = "hello";
// i 从 0 到 4(因为 size 是 5 ),逐个访问字符
for (int i = 0; i < str.size(); i++) { 
    // 输出每个字符,h、e、l、l、o 会挨个打印
    cout << str[i] << endl; 
}

二、结合题目,用字符串函数解题(选 1 道典型题讲~比如 “回文拼接” )

题目要求:判断字符串是否由 两个长度至少为 2 的回文串 拼接而成。

1. 先理解 “回文串”

回文串就是 “正着读、反着读都一样” 的字符串,比如 “aba”“aa” 。判断回文可以写个小函数:

// 判断字符串 str 是否是回文
bool isHuiWen(string str) {
    int len = str.size();
    // 从两头往中间比,只要有不一样就不是回文
    for (int i = 0; i < len / 2; i++) { 
        if (str[i] != str[len - 1 - i]) {
            return false; // 不一样,返回 false
        }
    }
    return true; // 全一样,是回文,返回 true
}

解释 :比如字符串长度是 5 ,下标 0 和 4 比、1 和 3 比,中间下标 2 不用比(自己和自己一样);如果长度是 4 ,下标 0 和 3 比、1 和 2 比 。

2. 整体解题思路(用字符串函数实现)

  • 输入字符串后,先看长度够不够(因为要拆成 两个长度≥2 的回文,所以原字符串长度至少得是 4 !比如 “aa”+“aa” 长度是 4 )。如果长度小于 4 ,直接输出 “No” 。
  • 然后用 substr 把字符串拆开,尝试所有可能的 “分割点” :
    • 比如字符串长度是 5 ,分割点可以是下标 2(拆成前 2 个字符、后 3 个字符)、下标 3(前 3 个、后 2 个)…… 只要保证 前半段长度≥2,后半段长度也≥2 就行!
    • 对每个分割出的 left(前半段)和 right(后半段),用 isHuiWen 函数判断是否都是回文。如果找到一组符合条件的,就输出 “Yes” ;否则输出 “No” 。

3. 完整代码 + 注释(小学生能懂的白话注释!)

#include <iostream>
#include <string>
using namespace std;

// 判断是否是回文串的函数
bool isHuiWen(string str) {
    int len = str.size();
    // 从两边往中间对比
    for (int i = 0; i < len / 2; i++) { 
        // 只要有一对字符不一样,就不是回文
        if (str[i] != str[len - 1 - i]) { 
            return false;
        }
    }
    // 全部对比完都一样,是回文
    return true; 
}

int main() {
    int n;
    // 输入要判断的字符串数量
    cin >> n; 
    while (n--) { // 循环 n 次,处理每个字符串
        string s;
        // 输入当前要判断的字符串
        cin >> s; 
        // 长度小于4,没法拆成两个长度≥2的串,直接输出No
        if (s.size() < 4) { 
            cout << "No" << endl;
            continue; // 跳过后面,处理下一个字符串
        }
        
        bool found = false; // 标记是否找到符合条件的拆分
        // 尝试所有可能的分割点:从分割后左边长度2开始,到左边长度 总长度-2 结束
        for (int lenLeft = 2; lenLeft <= s.size() - 2; lenLeft++) { 
            // 用substr截出左边字符串,长度是 lenLeft
            string left = s.substr(0, lenLeft); 
            // 截出右边字符串,从lenLeft位置开始,到末尾
            string right = s.substr(lenLeft); 
            
            // 判断左右是否都是回文
            if (isHuiWen(left) && isHuiWen(right)) { 
                found = true; // 找到符合条件的啦!
                break; // 不用再找其他分割点,跳出循环
            }
        }
        
        // 根据found的值输出结果
        if (found) {
            cout << "Yes" << endl;
        } else {
            cout << "No" << endl;
        }
    }
    return 0;
}

代码运行逻辑演示(以样例输入 “aabbbb” 为例):

  • 字符串长度是 6 ,满足 ≥4 。
  • 分割点尝试 lenLeft=2left 是 “aa”(回文),right 是 “bbbb”(回文)→ 符合条件,输出 “Yes” 。

三、其他题目里的字符串知识关联(简单提一下~)

  • 进制转换题目 :输入里的 “K 进制数” 是字符串形式(比如 “3F0” ),需要遍历每个字符,把它们转成数字,再按进制规则计算。这也会用到字符串遍历(str[i] 取字符 ),以及字符转数字的操作(比如字符 'A' 转成 10 ,可以用 str[i] - 'A' + 10 这类方法 )。
  • X 字矩阵题目 :虽然主要是字符数组拼接,但构建每一行字符串时,也可以用字符串拼接的思路(比如先建一个全是 “-” 的字符串,再把对角线位置换成 “+” ),变相练习字符串的 单个字符修改str[i] = '+' )。

四、总结 & 复习建议

  1. 字符串函数关键考点

    • size() 测长度、substr() 截取子串 。
    • 遍历字符串,访问每个字符 str[i]
    • 结合题目逻辑(比如回文判断、拆分拼接 ),把函数用起来解决实际问题!
  2. 练习小方法

    • 把代码里的函数单独拿出来,自己改改参数测试(比如换不同字符串截 substr ,看结果对不对 )。
    • 对着题目,用 “白话流程” 再讲一遍思路(像给同学讲题一样 ),确认自己真的懂啦~

这样字符串函数就复习好啦!代码里的注释很详细,慢慢读、跟着跑一遍例子,就能掌握用法啦,加油~ 有不懂的随时再问!

1 条评论

  • @ 2025-7-9 22:05:36

    编程小课堂:字符串函数与趣味题目实战

    一、课前准备

    小朋友们,我们要开启超有趣的编程小旅程啦!这次会用到字符串(就像一串字符小伙伴手拉手),还有解决几个好玩的题目,准备好和我一起出发了吗?

    二、认识字符串与常用函数(基础版)

    (一)什么是字符串

    字符串就是把好多单个字符(像字母 a、数字 5、符号 @ 这些)连在一起,比如 "abc" ,就像三个字符小伙伴 abc 手拉手排排站 。在 C++ 里,我们用 string 来表示它,比如:

    // 定义一个字符串变量 str ,里面存着 "hello"
    string str = "hello"; 
    

    (二)常用字符串函数

    1. size() 函数——数字符个数 就像数小饼干有几块,size() 能告诉我们字符串里有多少个字符。
    string str = "apple";
    // 数 apple 里的字符,a、p、p、l、e 一共 5 个,len 就会是 5
    int len = str.size(); 
    cout << len << endl;
    
    1. substr() 函数——截取子串 想象把一长串糖葫芦截成小段,substr 能从字符串里截出一小段。它有两种常用用法:
    • 用法一:substr(起始下标, 要截取的长度) 。下标从 0 开始数哦!比如字符串是 "abcdef"substr(1, 3) 就是从第 2 个字符(下标 1 对应的 b )开始,截 3 个字符,得到 "bcd"
    • 用法二:substr(起始下标) ,从起始下标开始,一直截到字符串末尾。比如 "abcdef"substr(2) ,就从下标 2c )开始,截出 "cdef"
    string str = "abcdefg";
    // 从下标 2 开始,截 3 个字符,得到 "cde"
    string part1 = str.substr(2, 3); 
    // 从下标 4 开始,截到末尾,得到 "efg"
    string part2 = str.substr(4); 
    cout << part1 << endl;
    cout << part2 << endl;
    
    1. 遍历字符串——和每个字符打招呼 就像挨个叫小朋友名字,我们可以用 for 循环,一个一个访问字符串里的字符。
    string str = "hello";
    // i 从 0 到 4(因为 hello 有 5 个字符,下标 0 到 4 )
    for (int i = 0; i < str.size(); i++) { 
        // 输出每个字符,会依次打印 h、e、l、l、o
        cout << str[i] << endl; 
    }
    

    三、实战题目一:回文拼接大挑战(4078 题)

    (一)题目理解

    要判断一个字符串能不能分成两个部分,每个部分至少有 2 个字符,而且每个部分都是回文(正着读和反着读一样,像 "aba""aa" 这样)。比如 "aabbbb" ,能分成 "aa"(回文)和 "bbbb"(回文),就符合要求 。

    (二)解题步骤 & 代码实现

    1. 先写判断回文的小帮手函数 我们需要一个函数,判断一个字符串是不是回文。思路就是从字符串两头往中间比,要是都一样,就是回文啦!
    // 这个函数叫 isHuiWen ,专门判断字符串 str 是不是回文
    bool isHuiWen(string str) {
        int len = str.size();
        // 从两边往中间对比,i 从 0 开始,到字符串一半的位置
        for (int i = 0; i < len / 2; i++) { 
            // 左边第 i 个字符和右边第 i 个字符对比
            if (str[i] != str[len - 1 - i]) { 
                // 不一样,就不是回文,返回 false
                return false; 
            }
        }
        // 全部对比完都一样,是回文,返回 true
        return true; 
    }
    
    1. 主函数处理输入输出和逻辑判断
    #include <iostream>
    #include <string>
    using namespace std;
    
    // 上面的 isHuiWen 函数放这里哦
    
    int main() {
        int n;
        // 输入有几个字符串要判断
        cin >> n; 
        // 循环 n 次,处理每个字符串
        while (n--) { 
            string s;
            // 输入当前要判断的字符串
            cin >> s; 
            // 字符串长度小于 4 ,没法分成两个至少 2 个字符的部分,直接输出 No
            if (s.size() < 4) { 
                cout << "No" << endl;
                // 跳过这次循环,处理下一个字符串
                continue; 
            }
            
            bool found = false; // 标记有没有找到符合条件的拆分
            // 尝试所有可能的分割点,左边长度从 2 开始,到总长度 - 2 结束(保证右边也至少 2 个字符)
            for (int lenLeft = 2; lenLeft <= s.size() - 2; lenLeft++) { 
                // 截取左边的子串,长度是 lenLeft
                string left = s.substr(0, lenLeft); 
                // 截取右边的子串,从 lenLeft 位置开始到末尾
                string right = s.substr(lenLeft); 
                
                // 判断左右两边是不是都是回文
                if (isHuiWen(left) && isHuiWen(right)) { 
                    found = true; // 找到符合条件的啦
                    // 找到就不用再试其他分割点,跳出循环
                    break; 
                }
            }
            
            // 根据 found 的结果输出
            if (found) {
                cout << "Yes" << endl;
            } else {
                cout << "No" << endl;
            }
        }
        return 0;
    }
    

    (三)代码运行示例

    比如输入样例里的 "aabbbb"

    • 字符串长度是 6 ,满足 ≥4 。
    • 分割点试到 lenLeft = 2 时,left"aa"(回文),right"bbbb"(回文),所以输出 "Yes"

    四、实战题目二:进制转换小能手(4019 题)

    (一)题目理解

    把不同进制(像二进制、八进制、十六进制)的数,转换成十进制。比如八进制 1362 ,要转换成十进制的 754 ;十六进制 3F0 转换成十进制的 1008

    (二)解题思路 & 代码实现

    1. 核心思路 对于一个 K 进制数,从右往左,每一位的 “权值” 是 K^0K^1K^2…… (比如十进制数 1233 的权值是 10^0210^1110^2 )。我们要把每一位的数字乘以对应的权值,再加起来,就得到十进制数啦!

    2. 代码实现

    #include <iostream>
    #include <string>
    // 用到 pow 函数(计算次方),需要这个头文件
    #include <cmath> 
    using namespace std;
    
    // 把字符转换成对应的数字,比如 'A' 转成 10 ,'3' 转成 3
    int charToNum(char c) {
        if (c >= '0' && c <= '9') {
            // 数字字符,直接减去 '0' 得到对应的数字
            return c - '0'; 
        } else {
            // 字母字符,比如 'A' ,减去 'A' 再加 10 ,得到 10
            return c - 'A' + 10; 
        }
    }
    
    int main() {
        int N;
        // 输入要转换的数的个数
        cin >> N; 
        while (N--) {
            int K;
            string s;
            // 输入进制 K 和要转换的 K 进制数(字符串形式)
            cin >> K >> s; 
            int result = 0;
            int len = s.size();
            // 从字符串左边到右边遍历(对应进制数从高位到低位)
            for (int i = 0; i < len; i++) { 
                char c = s[i];
                // 转换成对应的数字
                int num = charToNum(c); 
                // 计算当前位的权值,比如 K 进制数,第 i 位(从 0 开始数)的权值是 K 的 (len - 1 - i) 次方
                int power = len - 1 - i; 
                // 数字乘以权值,累加到结果
                result += num * pow(K, power); 
            }
            // 输出转换后的十进制数
            cout << result << endl; 
        }
        return 0;
    }
    

    (三)代码运行示例

    比如输入八进制 1362

    • 各位数字是 1362
    • 权值分别是 8^38^28^18^0
    • 计算:1*8^3 + 3*8^2 + 6*8^1 + 2*8^0 = 512 + 192 + 48 + 2 = 754 ,输出 754

    五、实战题目三:X 字矩阵大画家(4015 题)

    (一)题目理解

    要画出一个 N×N 的矩阵(N 是奇数),两条对角线位置是 + ,其他位置是 - 。比如 N=5 时,就会画出一个像 X 形状的图案 。

    (二)解题思路 & 代码实现

    1. 核心思路 对于矩阵的每一行,每一列,如果是对角线位置(行号和列号相同,或者行号 + 列号 = N - 1 ),就输出 + ,否则输出 -

    2. 代码实现

    #include <iostream>
    using namespace std;
    
    int main() {
        int N;
        // 输入矩阵的大小 N
        cin >> N; 
        // 循环 N 次,打印 N 行
        for (int i = 0; i < N; i++) { 
            // 循环 N 次,打印每行的 N 个字符
            for (int j = 0; j < N; j++) { 
                // 对角线位置:行号等于列号,或者行号 + 列号等于 N - 1
                if (i == j || i + j == N - 1) { 
                    cout << "+";
                } else {
                    cout << "-";
                }
            }
            // 一行打印完,换行
            cout << endl; 
        }
        return 0;
    }
    

    (三)代码运行示例

    当输入 N=5 时:

    • 第一行,i=0j 分别为 0(+ ,因为 0==0 )、1(- )、2(- )、3(- )、4(+ ,因为 0+4=4N-1=4 ),所以第一行是 +-+--+ ?不对,重新看: 哦,N=5 时,每行 j 从 0 到 4 :
    • 第 0 行(i=0 ):
      • j=0i==j+
      • j=1 :不满足 → -
      • j=2 :不满足 → -
      • j=3 :不满足 → -
      • j=4i + j = 0 + 4 = 4N-1=4+ 所以第一行是 +-+--+ ?不对,应该是 +---+ ?哦,我算错啦,N=5 时,每行 5 个字符: 第 0 行: j=0+ j=1- j=2- j=3- j=4+ 所以第一行是 +---+ (因为中间三个 - )。继续打印其他行,最后就会得到题目里的 X 形状啦!

    六、总结复习

    1. 字符串函数size() 数字符个数,substr() 截取子串,还能遍历字符串访问每个字符。
    2. 题目实战
      • 回文拼接:用函数判断回文,再拆分字符串尝试拼接。
      • 进制转换:利用权值计算,把不同进制转十进制。
      • X 字矩阵:根据行列位置判断输出 + 还是 -

    小朋友们,多敲敲代码,自己改改参数试试,就能更熟练啦!编程就像搭积木,多练习就能搭出超有趣的作品哟~ 有不懂的地方,随时找老师问呀!

    • 1