验证回文串

题目描述

LCR 018. 验证回文串 - 力扣(LeetCode)

解答

方法一:

回文意思是这个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;
    }
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值