字符串最后一个单词的长度
处理这类问题时需要注意,标准输入流 cin 遇到空格会终止读取,因此需要改用 getline 获取整行。
getline 并非成员函数,而是输入流的全局函数(定义在 <string> 头文件中),用于从输入流中读取一整行内容存入 string 对象。其用法包括基础读整行和指定终止符读取。
要计算最后一个单词的长度,常规思路是从头遍历统计空格,但这略显冗余。利用 string 类的 rfind 成员函数可以高效定位末尾空格:
- 若找到空格,长度 = 总长度 - (空格位置 + 1)
- 若未找到空格(整串为一个单词),长度 = 总长度
rfind 从字符串末尾向前查找指定字符或子串,返回起始下标;未找到时返回 string::npos。注意 string::npos 是静态常量,代表无效位置,判断时应使用 pos != string::npos,而非 -1。
#include<iostream>
#include<string>
using namespace std;
int main() {
string 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;
}
验证回文串
核心在于将大写字母转换为小写,并过滤非字母数字字符,随后利用双指针法验证对称性。虽然 STL 提供了便捷工具,但为了深入理解原理,我们先手动实现核心逻辑。
class Solution {
public:
bool isPalindrome(string s) {
// 步骤 1:过滤并转换(纯 ASCII 判断,无库函数)
string blank_string;
for (auto ch : s) {
if (ch >= 'A' && ch <= 'Z') {
blank_string += ch + 32; // 大写转小写
} else if (ch >= 'a' && ch <= 'z') {
blank_string += ch;
} else if (ch >= '0' && ch <= '9') {
blank_string += ch;
}
// 非字母/数字自动跳过
}
// 步骤 2:双指针验证回文
int left = 0;
int right = blank_string.size() - 1;
while (left < right) {
if (blank_string[left] != blank_string[right]) {
return false;
}
left++;
right--;
}
return true;
}
};
字符串中的第一个唯一字符
题目限定仅包含小写字母,这提示我们可以使用定长数组作为哈希表统计频次。首先初始化大小为 26 的数组,遍历字符串统计每个字符出现次数,再遍历原串查找第一个计数为 1 的字符索引。
class Solution {
public:
int firstUniqChar(string s) {
// 步骤 1:统计频次
int count[26] = {0};
for (char ch : s) {
count[ch - 'a']++; // 'a' 对应索引 0
}
// 步骤 2:查找首个唯一字符
for (int i = 0; i < s.size(); i++) {
if (count[s[i] - 'a'] == 1) {
return i;
}
}
return -1;
}
};
反转字符串
这道题相对直观,涉及到的 vector 容器后续会详细讲解,现阶段可将其视为字符序列处理。只需维护首尾两个指针,交换元素后分别向中间移动即可。
class Solution {
public:
void reverseString(vector<char>& s) {
if (s.empty()) return;
int start = 0;
int end = s.size() - 1;
while (start < end) {
swap(s[start], s[end]);
start++;
end--;
}
}
};

