题目描述
解答
方法一:
回文意思是这个string的这个对象倒着读和顺着读一样,忽略字符和空格;
先把大写的字符变成小写的;
从string s类的两端左端left 和 右端right开始往中间遍历,如果有s[left] != s[right]那就是不回文;
class Solution {
public:
//判断是否使字母或者数字
bool isnumorstr(char ch)
{
if(ch >= 'a' && ch <= 'z' || ch >= 'A' && ch <= 'Z' || ch >= '0' && ch <= '9')
{
return true;
}
return false;
}
bool isPalindrome(string s) {
//大写变小写
for(auto& e : s)
{
if( e >= 'A' && e <= 'Z')
e += 'a' - 'A';
}
int left = 0,right = s.size() - 1;
while(left < right)
{
//如果不是字符或者数字就继续
while(!isnumorstr(s[left]) && left < right)
{
left++;
}
while(!isnumorstr(s[right]) && left < right)
{
--right;
}
if(s[left] != s[right])
{
return false;
}
left++;
right--;
}
return true;
}
};
for(auto& e : s){}
这个有个引用,注意这不是取地址,引用的话,e变了,s里面的内容也直接跟着变,如果不使用引用出了作用域,e就失效了,就是等于s没变;
方法二(两种)
力扣官方解法
再string 一个对象,把去掉大写的和去掉其他符号空格的放进去,再比较,这样就很清楚
要用到两个函数
isalnum();
如果不是字符或者数字就返回false
tolower();
如果是大写就返回小写,其他不变;
第一种
class Solution {
public:
bool isPalindrome(string s) {
string s1;
//先把已经没有大写,且没有其他符号空格的放进去
for(auto e : s)
{
if(isalnum(e))
{
s1 += tolower(e);
}
}
//存逆置的再判断
string s2(s1.rbegin(), s1.rend());
return s2 == s1;
}
};
string s2():通过首尾的两个迭代器来构造s2;
用到了第七种使用迭代器范围进行构造;
第二种
放到一个对象里面,左右做对比,sgood[left] == sgond[right]
class Solution {
public:
bool isPalindrome(string s) {
string sgood;
for (char ch: s) {
if (isalnum(ch)) {
sgood += tolower(ch);
}
}
int n = sgood.size();
int left = 0, right = n - 1;
while (left < right) {
if (sgood[left] != sgood[right]) {
return false;
}
++left;
--right;
}
return true;
}
};