剑指 Offer II 018. 有效的回文

在这里插入图片描述
思路:
简单的回文串的判断,有以下几个操作需要进行
(1)将大小写字母统一成大写或者小写。
(2)删除非字母字符(不一定要做)。
(3)判断剩余字符串是否是回文。

    使用isalpha()函数判断字符是否是字母,使用tolower()函数强制将字符改为小写,使用sgood.rbegin(), sgood.rend()扭转字符串,然后将新字符串和老字符串进行比较,比较偷懒的做法。

class Solution {
public:
    bool isPalindrome(string s) {
        string sgood;
        for (char ch : s) {
            if (isalpha(ch)) {
                sgood += tolower(ch);
            }
        }
        string sgood_rev(sgood.rbegin(), sgood.rend());
        return sgood == sgood_rev;
    }
};

    如果我们我们不偷懒,那么需要使用双指针,左指针在最前,右指针在最后。两边的指针如果遇到不是字符的数就移动,然后进行比较,这里需要处理的是,如果字符是偶数和奇数的时候,怎么去设定终止条件,这里的终止条件最好写为left<right这样不管是怎么样,判断完最后两个数后,left只能>=right,这样偶数和奇数就不影响结果了。

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        int left = 0, right = n - 1;
        while (left < right) {
            while (left < right && !isalnum(s[left])) {
                ++left;
            }
            while (left < right && !isalnum(s[right])) {
                --right;
            }
            if (left < right) {
                if (tolower(s[left]) != tolower(s[right])) {
                    return false;
                }
                ++left;
                --right;
            }
        }
        return true;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值