题目要求
给定一个字符串,确定它是否是回文,仅考虑字母数字字符并忽略大小写。
注意:空字符串定义为有效回文。
解题思路
本题可以算是leetcode9 判断是不是回文数 的升级版,不同的是,本题字符中包含了字母,数字,空格,标点等特殊字符,所以在处理上和9题还是有点不同。
首先我们先将输入的字符串s 进行反转,并且保存下来,记为r。
然后只要比较r,s是不是相等即可,但是这里需要注意(去除符号和统一大小写):
根据题目要求,我们仅仅考虑字母和数字并且忽略大小写,所以要使用 isalnum()函数 来判断当前遍历的元素是不是字母或者数字,只有在是的时候才进行后续操作。并且通过使用tolower() / toupper()函数来统一大/小写。
最后用两个变量来存储处理后的s和r。比较s,r得到结果。
主要代码 c++
class Solution {
public:bool isPalindrome(string s) {
string ori,rev;string r =s;reverse(r.begin(),r.end());for(int i=0;i<s.size(); i++){
// 去除符号,统一大小写if(isalnum(s[i])) ori += tolower(s[i]);if(isalnum(r[i])) rev += tolower(r[i]);}return ori==rev;}
};
特别地
reverse(start,end) 函数实现方式:循环交换首尾元素。因此复杂度是线性的,并且循环半个数组长度。
使用函数tolower() / toupper() 统一大小写。
使用函数isalnum()来判断是否为数字和字母。