1 class Solution { 2 public: 3 bool isPalindrome(string s) { 4 //清空string内部所有不是字母的内容,要注意的是erase删除后返回其下一个元素,利用这点来连续删除,若使用i++则会导致运行时错误 5 for(string::iterator i=s.begin();i<s.end();) 6 { 7 if(!isalnum(*i)) 8 { 9 i=s.erase(i); 10 } 11 else i++; 12 } 13 //cout<<s<<endl; 14 //空串约定为真 15 if(s.size()==0) 16 return true; 17 //下面是一段朴素的判断回文字符串的例子,注意到大小写无关,所以调用了tolower函数 18 string::iterator start = s.begin(); 19 string::iterator end = start+s.size()-1; 20 21 while (start <= end&&start!=s.end()&&end>s.begin()) 22 { 23 24 if (tolower(*start) == tolower(*end)) 25 { 26 start++; 27 end--; 28 } 29 else 30 return false; 31 } 32 return true; 33 } 34 };
1. 首先要明确题目要求,它忽略所有不是字母的内容,比如 . 等标点,因此我们先过滤这些内容,通过string 的erase函数,但要利用erase的返回值来实现向前继续扫描,而不能单纯利用i++来实现;
2。 过滤好之后就是一个朴素的回文串判断了,题目要求大小写无关,所以我调用了tolower函数:小写字母不变,大写字母转为小写。