力扣125-验证回文串-C++

一、题目

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true
解释:"amanaplanacanalpanama" 是回文串
示例 2:

输入: "race a car"
输出: false
解释:"raceacar" 不是回文串

提示:

1 <= s.length <= 2 * 105
字符串 s 由 ASCII 字符组成

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/valid-palindrome

二、解题思路

这里需要注意的是,题目给出的s是由ASCII字符组成的,但是并不是每个字符都要进行判断,仅仅是要判断由s中的大写字母、小写字母以及数字构成的子序列是否为回文子串即可,并且这里认为同一个字母的大写和小写是相同的。

弄清楚这点之后,只需要定义两个指针分别指向s的第一个和最后一个字符,从两端向中间遍历,若当前的字符不是大小写字母或数字则略过,否则判断两指针所指向的字符是否相等,直至遍历完整个字符串。代码中出现的API都已经给出注释,若不想用API,也可以用ASCII码对应的范围来判断是否为大小写字母以及数字

三、代码

class Solution {
public:
    bool isPalindrome(string s) {
        int len = s.size();
        if(len < 2) return true;
        int left = 0, right = len -1;  //用两个指针从两端向中间扫描
        while(left < right){
            //isalnum用于判读一个字符是否为数字或字符,若是则返回true,不是则返回false
            while(left<right && !isalnum(s[left])){  
                left++;
            }
            while(left<right && !isalnum(s[right])){
                right--;
            }
            //tolower用于将大写字母转化为小写字母,非大写字母则不进行处理
            if(tolower(s[left]) != tolower(s[right])){ 
                return false;
            }
            else{
                left++;
                right--;
            }
        }
        return true;
    }
};

四、执行结果

 

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值