剑指 Offer II 018. 有效的回文

剑指 Offer II 018. 有效的回文_第1张图片
思路:
简单的回文串的判断,有以下几个操作需要进行
(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,这样偶数和奇数就不影响结果了。

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;
    }
};

你可能感兴趣的:(数据结构,算法,c++)