跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客我的书AI学习GitHub 精选镜像AI工具UI配色美学关于
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C++算法

C++ 字符串习题实战:输入处理与双指针技巧

针对 C++ 字符串处理的四个典型场景,分别演示了行输入读取、回文串验证、唯一字符定位及字符串反转的实现逻辑。重点讲解了 getline 替代 cin 的原因、rfind 查找优化、ASCII 码手动转换技巧以及双指针交换法的应用,适合初学者巩固基础语法与算法思维。

laoliangsh发布于 2026/3/30更新于 2026/10/2579 浏览
C++ 字符串习题实战:输入处理与双指针技巧

一、字符串最后一个单词的长度

做题时得注意,cin 读到空格就会停,所以这种带空格的输入得换用 getline。

文章配图

它不是成员函数,而是输入流的全局函数 getline(istream&, string&)(定义在 <string> 头文件中),作用是从输入流中读取一整行内容,存入 string 对象。

// 基础用法(读整行)
getline(输入流对象,string 对象);
// 扩展用法(读至指定终止符)
getline(输入流对象,string 对象,终止字符);

思路: 要获取最后一个单词的长度,常规做法是遍历字符串遇到空格就跳过并记录位置。这确实可行,但过程冗余。我们可以利用 string 类重载的成员函数 rfind 来优化。

rfind(' ') 从字符串末尾往前找第一个空格的位置。如果找到空格:最后一个单词的长度 = 字符串总长度 - (空格位置 + 1);如果没找到空格(整个字符串是一个单词):最后一个单词的长度 = 字符串总长度。

写代码前再简单了解一下 rfind:它是从字符串末尾向前查找指定内容的成员函数,返回匹配内容的起始下标(若未找到则返回 string::npos)。参数 1 是要查找的子串或字符,参数 2 是查找的结束位置(默认从末尾开始),返回值是匹配内容的起始下标。

文章配图

#include<iostream>
#include<string>
using namespace std;
int main() {
    string str;
    // cin >> str; //cin 检测到空格或换行就会结束,这里使用 getline
    getline(cin, str);
    
    size_t pos = str.rfind(' '); // 找到最后一个空格所处位置
    
    // 如果 pos != string::npos 表示找到了空格
     (pos != string::npos) {
        cout << str.() - (pos + ) << endl;
    }  {
        cout << str.() << endl;
    }
     ;
}
if
size
1
else
size
return
0

string::npos 是 C++ std::string 类里的一个静态常量,核心含义是「无效的位置 / 未找到匹配内容」。专门用来标记 find/rfind 等查找函数'没找到目标'的返回值。

❌ 错误用法:用 pos == -1 判断(因为 size_t 是无符号类型,-1 会被转换成 npos 的值,写法不规范且易错); ✅ 正确用法:必须用 pos != string::npos 判断'是否找到',pos == string::npos 判断'没找到'。

二、验证回文串

思路: 主要是将大写字母转换成小写字母,并将非字母数字的字符过滤掉,得到一个纯串。既然 string 有下标,就可以利用双指针法遍历这个串判断是否回文。

虽然标准库有现成函数,但为了理清底层逻辑,我们先手动实现转换过程。

class Solution {
public:
    bool isPalindrome(string s) {
        // 步骤 1:过滤 + 转换(纯 ASCII 判断,无库函数)
        string blank_string;
        for (auto ch : s) {
            // 判断是否是大写字母
            if (ch >= 'A' && ch <= 'Z') {
                // 大写转小写(ASCII+32)
                blank_string += ch + 32;
            }
            // 判断是否是小写字母
            else if (ch >= 'a' && ch <= 'z') {
                blank_string += ch;
            }
            // 判断是否是数字字符
            else if (ch >= '0' && ch <= '9') {
                blank_string += ch;
            }
            // 非字母/数字:自动跳过(不加入 blank_string)
        }
        
        // 步骤 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;
    }
};

三、字符串中的第一个唯一字符

思路: 题目已知串只有小写字母。不妨定义一个数组,初始化为 0,然后使用范围 for 遍历字符串,将每个字母对应存在数组中统计次数。接着遍历数组找到第一个出现次数为 1 的字符并返回索引,没有就返回 -1。

class Solution {
public:
    int firstUniqChar(string s) {
        // 步骤 1:统计每个小写字母的出现次数(数组索引对应字符,值对应次数)
        int count[26] = {0}; // 初始化为 0(26 个字母)
        for (char ch : s) {
            count[ch - 'a']++; // 'a'对应索引 0,'b'对应 1,以此类推
        }
        
        // 步骤 2:遍历原字符串,找第一个出现次数为 1 的字符
        for (int i = 0; i < s.size(); i++) {
            if (count[s[i] - 'a'] == 1) {
                return i; // 返回索引
            }
        }
        
        // 步骤 3:无唯一字符,返回 -1
        return -1;
    }
};

四、反转字符串

思路: 这是几个题目中最简单的一个。题中出现了 vector,怕大家不认识就放到了最后。大家先不关注,暂时把它当作 string 使用就好了,后续会细致讲解。这题其实不看容器很简单,只需要找到最后一个字符位置和头字符位置互换即可,然后一个 ++,一个 -- 即可解决问题。这里我们唯一需要注意的就是交换的时候可以使用 string 类中我们说过的 swap 成员函数。

文章配图

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

目录

  1. 一、字符串最后一个单词的长度
  2. 二、验证回文串
  3. 三、字符串中的第一个唯一字符
  4. 四、反转字符串

更多推荐文章

查看全部
  • C++ 内存管理进阶:从裸指针到智能指针的实战指南
  • Java 中的原码、反码与补码深入解析
  • C++11 新特性详解:Lambda、移动语义与可变参数模板
  • AI 普及时代,靠什么脱颖而出?
  • HarmonyOS6 RcButton 组件样式系统深度剖析
  • C++ string::find 方法详解与使用示例
  • 2026 春晚国产人形机器人技术突破与核心架构解析
  • 医疗连续体机器人模块化控制界面设计与 Python 库应用
  • 网络安全从零入门到专家的系统学习路线指南
  • 二级 Python 考试真题及参考代码解析(基本操作篇)
  • Star-Office-UI: 像素风格 AI 办公室看板,可视化 AI 助手工作状态
  • Python 异步数据汇聚与并行计算框架设计与实现
  • 企业微信自建应用:Python 实现消息收发功能
  • OpenCLAW 在 CentOS 7 环境下的安装部署
  • GESP C++ 七级真题解析:金币收集
  • Web 应用架构解析与安全漏洞实战指南
  • Visual C++ 运行库全版本一键安装工具 VisualCppRedist AIO 使用指南
  • 相交链表题解与详细分析
  • 基于 CesiumJS + React + Go 实现三维无人机编队实时巡航可视化系统
  • Java 集成 Umi-OCR 实现本地图片文字提取

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online