125. 验证回文串

211 阅读2分钟

[125. 验证回文串]

「这是我参与2022首次更文挑战的第24天,活动详情查看:2022首次更文挑战」。

题目描述

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

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

示例

示例1 :

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

示例 2:

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

提示:

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

在昨天的题目中,我们提到了回文的概念,今天就用一条经典的回文题目来看看这一类题目的思路。在判断回文的时候,一般都是使用双指针法,一个指针指向头部,一个指针指向尾部,之后进行一一比较。还有的做法是新建一个,进行整体翻转后两者进行比较,还有的就是将前半部分进行翻转,之后将前后两部分进行比较。最后还有就是使用栈的数据结构,也是可以实现的。

代码实现

由于在所给的字符串中,涉及到了大小写,符号,空格等等可以跳过的字符,所以需要在判断之前额外进行筛选。并且在上述的4种方法中,第一种的空间复杂度最优,不需要额外的内存空间。并且字符串的数据结果也能支持该算法,所以选取第一种算法进行实现。 bool isalnum(char)

/*
bool isalnum(char):判断一个字符是否为数字或字母,是返回ture,否返回false。
char tolower(char):将一个大写字符转换为小写,如果不是大写字符则直接返回该字符。
*/
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;
    }
};

总结

在字符串上使用双指针进行回文判断,并对回文的做法进行了一定的总结。