LeetCode 125:Valid Palindrome(c++)

一:题目

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.

二:解题分析


判断一个字符串是否为回文,则要判断其是否对称。

从字符串的开始位置和结束位置开始依次比较,判断当前字符是否为字母或数字,如果是,将字母统一转化为小写进行比较,相等,则开始位置右移,结束为止左移;不相等,返回false;如果是其他字符,则开始位置右移,结束位置左移;直到开始位置或结束为止将整个字符串遍历完成,如果没有不相等的情况,则返回ture;

注意:

1.只考虑字母和数字,是否为回文。

2.空字符串是回文

3.只包含标点或其他符号的字符串是回文。

4.字母的大小写,认为是相同的,即‘A’=‘a’


三:代码实现

class Solution {
public:
   
     //判断是否为字母或数字  
    bool isAlphanumeric(const char c) {
        if ('A' <= c && c <= 'Z')
            return true;
        else if ('a' <= c && c <= 'z')
            return true;
        else if ('0' <= c && c <= '9')
            return true;
        return false;
    }

    //如果为大写字母转为小写
    char toLower(const char c)
    {
        if ('A' <= c && c <= 'Z')
            return 'a' + c - 'A';
        return c;
    }

    bool isPalindrome(string s)
    {
        //空认为是回文
        if (s.empty())
            return true;
        //从前往后,从后往前比较    
        int begin = 0;
        int end = s.size() - 1;
        
        while (true) {
            //如果不是字母或数字
            while (begin < s.size() && !isAlphanumeric(s[begin])){
                begin++;
            }
            while (end >= 0 && !isAlphanumeric(s[end])) {
                end--;
            }
            

            if (toLower(s[begin]) != toLower(s[end])){
                return false;
            }
            
            if(begin>=s.size() || end<0)
                return true;
                
            begin++;
            end--;
        }
    }
        
    
};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值