字符串从入门到精通
登录以参加训练计划
以下是针对 CSP-J 字符串算法 的详细解析与例题讲解,帮助您系统掌握相关知识点:
一、字符串基础操作
1. 字符串输入输出
-
C风格字符数组:
#include <cstdio> char str[100]; scanf("%s", str); // 输入(遇空格终止) printf("%s", str);
注意:
scanf
会自动添加结束符\0
。 -
C++ string类:
#include <string> #include <iostream> using namespace std; string s; cin >> s; // 输入(遇空格终止) getline(cin, s); // 输入整行(包含空格) cout << s;
2. 字符串遍历
- 下标遍历:
for (int i = 0; i < s.size(); i++) { cout << s[i]; // 访问字符 }
- 范围遍历(C++11):
for (char c : s) { cout << c; }
二、常用字符串函数
函数 | 功能 | 示例 |
---|---|---|
s.size() / s.length() |
返回字符串长度 | int len = s.size(); |
s.substr(pos, len) |
提取子串(从pos 开始,长度len ) |
s.substr(2,3) → 第2字符起取3个 |
s.find(str) |
查找子串位置,未找到返回string::npos |
if(s.find("abc") != string::npos) |
s.replace(pos, len, str) |
替换子串 | s.replace(0,2,"xyz") |
三、常见字符串算法
1. 回文判断
思路:双指针法,从两端向中间比较。
bool isPalindrome(string s) {
int left = 0, right = s.size() - 1;
while (left < right) {
if (s[left] != s[right]) return false;
left++;
right--;
}
return true;
}
2. 统计字符出现次数
int countChar(string s, char target) {
int cnt = 0;
for (char c : s) {
if (c == target) cnt++;
}
return cnt;
}
3. 字符串反转
方法1:使用标准库函数:
reverse(s.begin(), s.end());
方法2:手动交换字符:
int n = s.size();
for (int i = 0; i < n/2; i++) {
swap(s[i], s[n - i - 1]);
}
四、经典例题解析
例题1:字符替换
题目:将字符串中所有的小写字母 a
替换为 @
。
string s = "apple and banana";
for (char &c : s) { // 引用修改原字符
if (c == 'a') c = '@';
}
cout << s; // 输出 "@pple @nd b@n@n@"
例题2:子串查找(CSP-J 2021 模拟题)
题目:统计字符串 s
中 "CSP"
出现的次数。
string s = "CSP-J CSP-S CSP考试";
int cnt = 0, pos = 0;
while ((pos = s.find("CSP", pos)) != string::npos) {
cnt++;
pos += 3; // 跳过已匹配部分
}
cout << cnt; // 输出3
例题3:密码强度检测
题目:判断密码是否满足以下条件:
- 长度 ≥8;
- 包含至少一个大写字母;
- 包含至少一个数字。
代码实现:
bool checkPassword(string pwd) {
if (pwd.size() < 8) return false;
bool hasUpper = false, hasDigit = false;
for (char c : pwd) {
if (isupper(c)) hasUpper = true;
if (isdigit(c)) hasDigit = true;
}
return hasUpper && hasDigit;
}
五、易错点总结
- 越界访问:使用下标时确保
i < s.size()
。 - 忘记
\0
:C风格字符串操作需预留结束符空间。 - 混合输入:
cin >> n; getline(cin, s);
需清空缓冲区:cin.ignore(); // 忽略残留的换行符
六、练习题
- 反转单词顺序:输入一行句子,反转每个单词的顺序(如
"hello world"
→"world hello"
)。 - 最长连续字符:找出字符串中最长的连续相同字符段(如
"aaabbcc"
→'a' 出现3次
)。 - 字符串压缩:将连续重复字符压缩(如
"aaabbbcc"
→"a3b3c2"
)。
参考答案可参考后续更新或联系作者获取。掌握这些内容后,字符串类题目将迎刃而解! 🚀
- 参加人数
- 3
- 创建人