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; }