125. 验证回文串

107 阅读2分钟

125. 验证回文串 - 力扣(LeetCode)

双指针

class Solution {
public:
    bool isPalindrome(string s) {


int left=0;
int right=s.size()-1;


                while(left<right)
                {

                while(left<right && !isalnum(s[left]))
                {
                    left++;
                }

                                while(left<right&& !isalnum(s[right]))
                                {
                                right--;
                                }


                                if(tolower(s[left])!=tolower(s[right]))
                                {
                                return false;
                                }
                                left++;
                                right--;

                }

return true;
    }
};

使用两个指针left和right来从字符串的开头和结尾进行迭代。
然后使用嵌套的while循环来跳过非字母数字字符,并比较左右指针处的字符,忽略大小写。

如果左右指针处的字符不匹配,方法立即返回false。如果所有字符都比较并且匹配,方法返回true

表示输入字符串是一个回文。

总的来说,该方法通过忽略非字母数字字符并在忽略大小写的情况下比较字符,有效地检查回文。

在C++中,isalnum是一个标准库函数,它存在于<cctype>头文件中。这个函数用于检查给定的字符是否为字母或数字。如果是,则返回非零值;如果不是,则返回0。

image.png

辅助空间

image.png

class Solution {
public:
    bool isPalindrome(string s) {
        string newS; // 定义一个新string数组
        for(auto ch : s){ // auto是让编译器自己判断数据类型
        if(islower(ch) || isdigit(ch)){  // 进行判断是否是小写字母或者数字
            newS += ch; //是的话,就把ch读入存储到newS新string数组中
        }else if(isupper(ch)) // 如果循环读取到的ch 是大写字母
            newS += tolower(ch);  // 把大写字母变为小写存储进去
        }
        string reverseS = newS;  // 再次定义一个新数组,这个新新数组是要reverse之后和新数组比较的
        reverse(reverseS.begin(),reverseS.end());
        // 为什么要这一步?因为回文即abba 和 reverse之后的abba 相等,只有这样相等才构成回文
        return (newS.compare(reverseS) == 0); // 如果相等无差异则返回0 即为true是回文

    }
};