多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
## 一.题目描述 ![](https://box.kancloud.cn/2016-01-05_568bb5ea2190e.jpg) ## 二.解题技巧 这道题考察回文数(palindrome),这一概念起源于在数学中一类数字,这类数字拥有这样的特征: 设n是一任意自然数。若将n的各位数字**反向排列**所得自然数n1与n相等,则称n为一回文数。例如,若n=1234321,则称n为一回文数;但若n=1234567,则n不是回文数。 同理,可以定义英文/中文的回文数,概念和以上的类似,本题就是检测字符串是否为回文数。与数字回文不同的是,题目中给出的英文句子/短语包含空格及标点符号,因此需要在算法设计时加多一层判断,可能会用到以下函数: ~~~ isalpha() // 如果参数是一个字母,返回一个非零数;否则返回为0 isalnum() // 如果参数是一个字母或数字,返回一个非零数;否则返回为0 isdigit() // 如果参数是一个数字(0-9)返回一个非零数;否则返回为0 ~~~ 若不要求区分字符串的大小写问题,可以加入以下函数: ~~~ transform(string.begin(),string.end(),string.begin(),toupper); // 将字符串中的内容转换为大写字母 transform(string.begin(),string.end(),string.begin(),tolower); // 将字符串中的内容转换为小写字母 ~~~ 题目说明,空字符串也可判定为回文,除此之外,该题目并没有很复杂的逻辑问题和边界条件。 ## 三.示例代码 ~~~ #include <string> #include <iostream> using std::string; class Solution { public: bool validPalindrome(string s) { if (s == "") return true; auto index_start = s.begin(), index_end = prev(s.end()); while (index_start < index_end) { if (!isalpha(*index_start)) index_start++; else if (!isalpha(*index_end)) index_end--; else if (*index_start == *index_end) { index_start++; index_end--; } else return false; } return true; } }; ~~~ ## 四.一个示例结果 输入回文字符串: ![](https://box.kancloud.cn/2016-01-05_568bb5ea43cbd.jpg) 输入非回文字符串: ![](https://box.kancloud.cn/2016-01-05_568bb5ea58063.jpg)