1、盲听C哈说
哈喽,大家好,我是小C,一个每天嘻嘻哈哈的斜杠女青年。一直受一句话的影响 — "你关注的人,决定你看到的世界!" 现在是2024年12月21日早上10点,距离过年只剩一个多月了,总想在今年最后阶段留下些什么,今天给大家分享一道关于字符串知识点的习题 — 回文字串。
回文串,这个名字听起来是不是很神秘?它其实是一种特殊的字符串,无论是从前往后读,还是从后往前读,都是一样的。比如“level”或者“radar”,它们都是回文串。这个概念不仅有趣,而且在编程和数学中都有重要的应用。
2、问题描述
(1)题目描述
输入一串字符,字符个数不超过100,且以“.”结束。 判断它们是否构成回文。
(2)输入描述
一行字符串。
(3)输出描述
是否为回文串。是输出“Yes”,否输出“No”。
(4)样例输入
abccb
(5)样例输出
No
3、问题分析
如果是我的话,这道题我会直接使用c++中的string类型来解决,c++中的string类是标准模板库(STL)的一部分,它提供了一个可变长度的字符序列,通常用于存储和管理字符串。
string中内置了很多处理字符串的函数,比如可以直接截取子串、求长度、找子串、删除指定字符元素等,更多关于内置字符串处理函数可以去查询相关手册,我们只需要记住几个常用的就可以了。
在这里,我主要用到了erase和size函数,接下来我将重点对他们进行一个介绍:
size()函数:用来统计字符串中字符的个数
代码演示如下:统计字符串"hello world!"中字符的总个数
erase(index,count):移除从位置index开始的count个字符。index有下标、索引的意思,count有计数、个数的意思。
代码演示如下:删除 "hello world!"中最后一个字符,即删除!字符。
除了用到相关的字符串处理函数之外,我还用到了一个函数:reverse,它可以用于反转容器中元素的顺序,使用该函数,需要引入<algorithm>头文件,但是如果你使用了万能头文件<bits/stdc++.h>,那么就可以不引入<algorithm>函数,该函数使用方式如下:
reverse(first,last):first
和last
是定义要反转范围的迭代器。
有的人可能会有点疑惑,啥是迭代器?至少我当年学习的时候会产生这样的疑问,所以我还是得解释一下, 想象一下,你去图书馆找书,图书馆里有很多书架,每个书架上都摆满了书。如果你想找到一本特定的书,你可能会从第一个书架开始,一本一本地看,直到找到你想要的那本书。在这个过程中,你就像是“迭代”了整个书架,一本一本地“遍历”过去。
在C++中,迭代器就像是你在图书馆里用来指向和遍历书架上的书的工具。它是一个抽象的概念,可以想象成一个指针或者一个特殊的变量,它指向容器(比如数组、向量等)中的一个元素,并且可以移动到下一个元素。
为什么这道题要使用这个reverse函数呢?基本思路是这样的:假设有字符串: "hello world.",现在要判断它是否是一个回文串,那我们是不是只需要对其进行一个反转,然后和原串比较一下就可以了,"hello world."反过来的字符串为:".dlrow olleh",显然,该串和原串不相等,因此"hello world."不是一个回文串。
对于string类型的数据,如何通过reverse函数得到它翻转之后的字符串呢?这个时候就需要使用string字符串的迭代器了,你可以把迭代器想象成指向某个位置的指针,或者记录某个位置的工具,代码演示如下:
注意:s.begin( )代表获得s这个字符串开始位置的迭代器,即获得一个指向h这个字符的指针,至于具体是啥不用关心,反正就是了解s.begin( )会得到一个东西,这个东西可以记录h这个字符的位置,同理,有的人会认为,s.end( )代表获得s这个字符串结束位置的迭代器,即获得一个指向!这个字符的指针,这里有一点错误,实际上官方不是这样规定的,官方咋说的呢?官方说:s.end()获得的指针是指向这个字符串最后一个字符的下一个位置的。
有了这些函数的帮助,这道题就简单多了:对于输入的字符串,我们可以使用erase先删除字符串的结尾字符.,删除之后,我们对剩下的字符串使用reverse函数进行反转,反转之后将其与去掉.的原始字符串进行比较,如果相等,那么输入的字符串就是回文串,输出Yes,否则不是,输出No。
4、代码实现
#include<bits/stdc++.h> // 包含C++标准库的所有头文件,用于简化代码编写
using namespace std; // 使用标准命名空间,这样可以直接使用cout、cin等而不需要std::前缀
int main() // 主函数入口
{
string s, t; // 定义两个字符串变量s和t
cin >> s; // 从标准输入读取一个字符串并赋值给s
// 移除字符串s的最后一个字符
s.erase(s.size() - 1, 1); // size()返回字符串长度,erase函数从指定位置开始移除指定数量的字符
t = s; // 将修改后的字符串s赋值给t
reverse(s.begin(), s.end()); // 使用reverse函数将字符串s反转
// 比较反转后的字符串s和原始字符串t是否相等
if(s == t) // 如果s和t相等
cout << "Yes"; // 输出"Yes"
else // 如果s和t不相等
cout << "No"; // 输出"No"
return 0; // 程序正常结束
}
这段代码的主要功能是检查输入的字符串在移除最后一个字符后,是否与原字符串反转后的结果相同,并输出"Yes"或"No"。如果相同,说明原字符串去掉最后一个字符后是回文的;如果不同,则不是。
5、OJ测试
大家写完代码之后如果想要做OJ(在线评测)测试,可以找我要相关的链接,电脑自动评测会更加准确~,也可以找我要相关的经典必刷题单(ps:教学经验中总结出来的必刷题单,真的是一步一步试错得到的经验,难怪人家总是说实践出真知),还是那句话,你关注的人,决定你看到的世界,好了,今天这篇文章就讲到这里,我们下期再见~