C++ string类用法详解(附带实例)
在 C++ 中,string 是一个功能强大的类,用于表示和处理字符串。
string 提供了一系列的便利函数,如连接、查找、替换、插入、删除和子串操作等。我们可以将 string 想象成一个动态数组,它能够根据需要自动调整大小。
得益于其简洁的操作和优秀的封装性,string 在算法竞赛中备受青睐。
使用字符串字面量来初始化:
使用另一个string对象来初始化:
使用字符数组来初始化:
使用重复的字符来初始化:
在算法竞赛中,string 通常用作键值,较少涉及修改操作。若需频繁修改或构造字符串,建议选用字符数组。这是因为字符数组在某些操作上会更高效。
【实例】给定一个仅包含大写字母的长度为 n 的字符串 S,求出其回文子串的数量。
1) 输入格式:
本题有多组测试用例,第一行包含一个整数 T,表示测试用例的数量(1≤T≤1000)。
对于每组测试用例:
第一行包含一个整数 n(1≤∑n≤103),表示字符串长度。
第二行包含一个仅由大写字母组成的字符串 S。
2) 输出格式:
输出一个整数,表示结果。
样例:
计算一个给定字符串中回文子串的数量,可以通过枚举所有可能的子串,并检查每个子串是否为回文来解决这个问题。由于题目对时间复杂度没有严格限制,我们可以利用 string 类的 substr() 方法来简化编程过程,从而使代码更加简洁且易于理解。
string 提供了一系列的便利函数,如连接、查找、替换、插入、删除和子串操作等。我们可以将 string 想象成一个动态数组,它能够根据需要自动调整大小。
得益于其简洁的操作和优秀的封装性,string 在算法竞赛中备受青睐。
C++ string的初始化
在使用 string 之前,需要包含相应的头文件或直接使用万能头文件:#include <string> using namespace std;string的初始化方式多种多样,接下来分别说明。
使用字符串字面量来初始化:
string str = "Hello World";
使用另一个string对象来初始化:
string str1 = "Hello"; string str2 = str1;
使用字符数组来初始化:
char arr[] = "Hello"; string str3(arr);
使用重复的字符来初始化:
string str4(5, 'A'); // 结果为"AAAAA"
C++ string的基本操作
下表列出了一些常用的 string 操作方法及其时间复杂度。| 方法 | 作用 | 时间复杂度 |
|---|---|---|
| length() | 返回字符串的长度 | O(1) |
| empty() | 判断字符串是否为空 | O(1) |
| substr(pos, len) | 返回从 pos 开始、长度为 len 的子串(若省略 len,则表示截取到末尾) | O(len) |
| erase(pos, len) | 删除从 pos 开始、长度为 len 的子串 | O(len) |
| operator + char/str | 将字符或字符串拼接到当前字符串后面 | O(len) |
| operator<、<=、>、>=、== | 按字典顺序比较字符串 | O(n) |
| find(str) | 返回指定字符串或字符在当前字符串中第一次出现的位置 | O(nm) |
在算法竞赛中,string 通常用作键值,较少涉及修改操作。若需频繁修改或构造字符串,建议选用字符数组。这是因为字符数组在某些操作上会更高效。
【实例】给定一个仅包含大写字母的长度为 n 的字符串 S,求出其回文子串的数量。
1) 输入格式:
本题有多组测试用例,第一行包含一个整数 T,表示测试用例的数量(1≤T≤1000)。
对于每组测试用例:
第一行包含一个整数 n(1≤∑n≤103),表示字符串长度。
第二行包含一个仅由大写字母组成的字符串 S。
2) 输出格式:
输出一个整数,表示结果。
样例:

计算一个给定字符串中回文子串的数量,可以通过枚举所有可能的子串,并检查每个子串是否为回文来解决这个问题。由于题目对时间复杂度没有严格限制,我们可以利用 string 类的 substr() 方法来简化编程过程,从而使代码更加简洁且易于理解。
#include <bits/stdc++.h>
using namespace std;
// 判断一个字符串是否为回文串
bool isPalindrome(string s) {
for(int i = 0, j = (int)s.length() - 1; i <= j; ++ i, -- j)
if(s[i] != s[j]) return false; // 如果两端字符不相等,则不是回文串
return true; // 否则是回文串
}
// 解决问题的主要函数
void solve() {
int n;
cin >> n; // 输入字符串的长度
string s;
cin >> s; // 输入字符串
int ans = 0; // 初始化回文子串的数量
// 遍历所有可能的子串
for(int i = 0; i < n; ++ i)
for(int j = i; j < n; ++ j)
if(isPalindrome(s.substr(i, j - i + 1))) ans++; // 如果子串是回文串,则计数器加1
cout << ans << '\n'; // 输出回文子串的数量
}
int main() {
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); // 优化输入/输出流
int N;
cin >> N; // 输入测试用例的数量
while (N--)
solve(); // 对每个测试用例调用solve函数
return 0;
}
ICP备案:
公安联网备案: