C++ string 类实战:单词长度、回文串与唯一字符
在 C++ 刷题过程中,string 类的操作是高频考点。今天整理了四个经典题目,重点在于理解底层逻辑和标准库函数的用法,而不是盲目调用 API。
一、字符串最后一个单词的长度
使用 cin 读取字符串时,遇到空格会自动停止,这在处理包含空格的句子时会出错。此时应改用全局函数 getline 读取整行内容。
getline(istream&, string&) 定义在 <string> 头文件中,能从输入流中读取一整行存入 string 对象。若需读到特定字符为止,可传入第三个参数指定终止符。
求最后一个单词长度的思路很直观:找到最后一个空格的位置。如果存在空格,长度即为总长减去空格位置及空格本身;若无空格,则整个字符串就是一个单词。这里可以利用 rfind 成员函数从后向前查找。
rfind 从字符串末尾向前搜索,返回匹配内容的起始下标,未找到则返回 string::npos。注意 string::npos 是无符号类型常量,判断时应使用 != string::npos,避免用 -1 比较。
#include <iostream>
#include <string>
using namespace std;
int main() {
string str;
// cin >> str; // 遇到空格会停止,不适合本题
getline(cin, str); // 读取整行
size_t pos = str.rfind(' '); // 查找最后一个空格
if (pos != string::npos) {
cout << str.size() - (pos + 1) << endl;
} else {
cout << str.size() << endl;
}
return 0;
}
二、验证回文串
验证回文串的核心在于预处理:忽略大小写差异和非字母数字字符。虽然 C++ 有现成函数,但为了理解逻辑,我们手动实现转换和过滤。
遍历原字符串,将大写字母转为小写(ASCII 码加 32),保留小写字母和数字,其余字符跳过。处理后的字符串使用双指针法,左右向中间靠拢比对。
class Solution {
public:
{
string blank_string;
( ch : s) {
(ch >= && ch <= ) {
blank_string += ch + ;
} (ch >= && ch <= ) {
blank_string += ch;
} (ch >= && ch <= ) {
blank_string += ch;
}
}
left = ;
right = blank_string.() - ;
(left < right) {
(blank_string[left] != blank_string[right]) {
;
}
left++;
right--;
}
;
}
};


