LeetCode 125. 验证回文串(C++)

题目:

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

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

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

思路:

现将字符串的所有字母转换为小写字母,然后采用对撞指针的方式从首尾开始遍历字符串,比较前后的第n个数字或字母是否相同,若不相同直接返回false,相同则继续比较直至左右索引相遇。

class Solution {
public:
    bool isPalindrome(string s) {
        transform(s.begin(),s.end(),s.begin(),::tolower);
        int left = 0;
        int right = s.length() - 1;
        while(left < right){
            if(!((s[left] <= 'z'&& s[left] >= 'a') || (s[left] <= '9' && s[left]>= '0')) && left < right)
                 ++left;
            else if(!((s[right] <= 'z'&& s[right] >= 'a') || (s[right] <= '9' && s[right]>= '0')) && left < right)
                 --right;
            else if(s[left] != s[right])
                return false;
            else{
                ++left;
                --right;
            }

        }
        return true;        
    }
};

其中可以使用isalnum()替换(s[left] <= ‘z’&& s[left] >= ‘a’) || (s[left] <= ‘9’ && s[left]>= ‘0’),同时加入对空字符串的判断,替换后代码如下:

        if(s.empty()) return true;
        int left = 0, right = s.length()-1;
        transform(s.begin(),s.end(), s.begin(), ::tolower);
        while(left < right){
            if(!isalnum(s[left])) ++left;
            else if(!isalnum(s[right])) --right;
            else if(s[left] != s[right]) return false;
            else ++left, --right;
        }
        return true;

你可能感兴趣的:(LeetCode)