前言
继上篇有关 string 类的文章,已有一段时间未更新后续啦。今天我们来继续学习 string 类的一些常用接口,然后使用这些接口进行算法习题练习。
C++ STL String 类常用接口涵盖访问遍历、修改操作及非成员函数。通过反转字母、查找唯一字符、验证回文等算法习题巩固接口应用。重点掌握 push_back、append、find、substr 等方法,以及双指针与 reverse 在字符串处理中的实践技巧。

继上篇有关 string 类的文章,已有一段时间未更新后续啦。今天我们来继续学习 string 类的一些常用接口,然后使用这些接口进行算法习题练习。
operator[]: 返回 pos 位置的字符,const string 类对象调用begin + end: begin 获取第一个字符的迭代器,end 获取最后一个字符下一个位置的迭代器rbegin + rend: rbegin 获取最后一个字符的迭代器,rend 获取第一个字符下一个位置的迭代器注意:
push_back: 在字符串后尾插字符 cappend: 在字符串后追加一个字符串operator+=: 在字符串后追加字符串 strc_str: 返回 C 格式字符串find + npos: 从字符串 pos 位置开始往后找字符 c,返回该字符在字符串中的位置rfind: 从字符串 pos 位置开始往前找字符 c,返回该字符在字符串中的位置substr: 在 str 中从 pos 位置开始,截取 n 个字符,然后将其返回注意:
operator+: 尽量少用,因为传值返回,导致深拷贝效率低operator>>: 输入运算符重载operator<<: 输出运算符重载getline: 获取一行字符串relational operators: 大小比较上面的接口了解一下就 OK 啦,实在想弄明白,点击链接查看文档,已经生成文档链接了。我们后续模拟实现 string 类的时候也会讲到。
下面来一些习题,都是有关字符串的操作的,这样能更好的熟练 string 类的一些接口的使用。
本题就是使用的对撞指针。话不多说,上代码。
class Solution {
public:
bool isLetter(char ch) {
if (ch >= 'a' && ch <= 'z') return true;
if (ch >= 'A' && ch <= 'Z') return true;
return false;
}
string reverseOnlyLetters(string S) {
if (S.empty()) return S;
size_t begin = 0, end = S.size() - 1;
while (begin < end) {
while (begin < end && !isLetter(S[begin])) ++begin;
while (begin < end && !isLetter(S[end])) --end;
swap(S[begin], S[end]);
++begin;
--end;
}
return S;
}
};
本题就是简单的做一个映射关系,把字符当做下标来看,然后从小到大遍历一遍,找到第一个 1 就行。类似于数据结构排序里面讲的计数排序。话不多说,上代码。
class Solution {
public:
int firstUniqChar(string s) {
int count[256] = {0};
int size = s.size();
for (int i = 0; i < size; i++) {
count[s[i]]++;
}
for (int i = 0; i < size; i++) {
if (count[s[i]] == 1) return i;
}
return -1;
}
};
这题说的是最后一个单词的长度,最直接的方法就是使用 rfind 这个接口,从后面开始遍历,直到遇到空格。另外就是输入字符串时要注意空格也要输入,所以要使用 getline。代码如下。
#include<iostream>
using namespace std;
int main() {
string str;
getline(cin, str);
int pos = str.rfind(' ');
cout << str.size() - pos - 1 << endl;
}
本题也是对撞指针,根据题意模拟一遍就好啦。然后就是处理一下大小写字符和空格。话不多说,上代码。
class Solution {
public:
bool isPalindrome(string s) {
int size = s.size();
int left = 0, right = size - 1;
for (int i = 0; i < size; i++) {
if (s[i] >= 'A' && s[i] <= 'Z') { s[i] += 32; }
}
while (left < right) {
while (left < right && !((s[left] <= 'z' && s[left] >= 'a') || (s[left] <= '9' && s[left] >= '0'))) { left++; }
while (left < right && !((s[right] <= 'z' && s[right] >= 'a') || (s[right] <= '9' && s[right] >= '0'))) { right--; }
if (s[left] == s[right]) { left++; right--; }
else return false;
}
return true;
}
};
这题还是简单的,使用一个 reverse 就好啦。注意:reverse 和 reserve 是不一样的嗷。reverse 是颠倒字符串,reserve 是给字符串预留空间。话不多说,上代码。
class Solution {
public:
string reverseStr(string s, int k) {
int n = s.length();
for (int i = 0; i < n; i += 2 * k) {
reverse(s.begin() + i, s.begin() + min(i + k, n));
}
return s;
}
};
这题是上一题的进阶,但是也是相对来说比较简单的。就是在上一题的基础上,多处理一下就好啦。以空格为区分界限,然后用 reverse 进行翻转。这里就用到了迭代器,begin 和 end。
class Solution {
public:
string reverseWords(string s) {
int pos = 0;
pos = s.find(" ", 0);
reverse(s.begin(), s.begin() + pos);
while (1) {
if (pos == s.rfind(' ')) {
reverse(s.begin() + pos + 1, s.end());
break;
}
int x = pos;
pos = s.find(' ', pos + 1);
reverse(s.begin() + x + 1, s.begin() + pos);
}
return s;
}
};
这题也是有关 string 的。但是相比前面的题目就难处理好多,这里涉及到了字符串相加。字符串相加之前要先处理成正常的数字,然后再进行相加。字符串太长也不能直接转化为整型,所以要从后往前一个一个字符往前加。加到最前面就是最终答案,处理起来还是比较麻烦的,但是整体思路还是比较简单。话不多说,上代码。
class Solution {
public:
string addStrings(string num1, string num2) {
int end1 = num1.size() - 1;
int end2 = num2.size() - 1;
int value1 = 0, value2 = 0, next = 0;
string ans;
while (end1 >= 0 || end2 >= 0) {
if (end1 >= 0) { value1 = num1[end1--] - '0'; } else value1 = 0;
if (end2 >= 0) { value2 = num2[end2--] - '0'; } else value2 = 0;
int value = value1 + value2 + next;
if (value > 9) { next = 1; value -= 10; } else next = 0;
ans += (value + '0');
}
if (next == 1) { ans += '1'; }
reverse(ans.begin(), ans.end());
return ans;
}
};
今天的有关 string 的习题就到这里啦。
今天把 string 类剩下的一些常用接口做了解,然后练习一些有关 string 的习题,加深巩固用法。下一篇博客我们就来继续加深 string 的学习吧。

微信公众号「极客日志」,在微信中扫描左侧二维码关注。展示文案:极客日志 zeeklog
使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online
将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online
将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online
将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online
将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online
通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online