《LeetCode之每日一题》:132.验证回文串

Posted 是七喜呀!

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了《LeetCode之每日一题》:132.验证回文串相关的知识,希望对你有一定的参考价值。

验证回文串


题目链接: 验证回文串

有关题目

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

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

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

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

1 <= s.length <= 2 * 10^5
字符串 s 由 ASCII 字符组成

题解

Tips

tolower()把字符转换成小写字母,非字母字符不做出处理

法一:筛选 + 判断
代码一:使用字符串翻转 API

class Solution {
public:
    bool isPalindrome(string s) {
        string sgood;
        for (auto &ch : s){
            if (isalnum(ch)){
                sgood += tolower(ch);
            }
        }
        string sgood_rev(sgood.rbegin(), sgood.rend());
        return sgood == sgood_rev;
    }
};

时间复杂度:O(N)
空间复杂度:O(N)
代码二:双指针

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        string sgood;
        for (auto& ch : s){
            if (isalnum(ch)){
                sgood += tolower(ch);
            }
        }
        int l = 0, r = sgood.size() - 1;//注意验证的回文串为sgood
        while(l < r){
            if (sgood[l] != sgood[r]){
                return false; 
            }
            ++l, --r;
        }
        return true;
    }
};

时间复杂度:O(N)
空间复杂度:O(N)
法二:在原字符串上直接判断
代码一:

class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        if (n == 0){
            return true;
        }
        
        for (int l = 0, r = n - 1; l < r;){
            while (l < n && !isdigit(s[l]) && !isalpha(s[l])){
                l++;
            }
            while(r >= 0 && !isdigit(s[r]) && !isalpha(s[r])){
                r--;
            }
            if (l == n || r < 0){//全串为非字母,非数字
                return true;
            }
            else if (isdigit(s[l]) && isdigit(s[r]) && s[l] == s[r]){
                ++l, --r;
            }
            else if (isalpha(s[l]) && isalpha(s[r]) && tolower(s[l]) == tolower(s[r])){
                ++l, --r;
            }
            else{
                return false;
            }
        }
        return true;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)
代码二:


class Solution {
public:
    bool isPalindrome(string s) {
        int n = s.size();
        if (n == 0){
            return true;
        }

        int l = 0, r = n - 1;
        while(l < r){
            while(l < r && !isalnum(s[l])){
                ++l;
            }
            while(l < r && !isalnum(s[r])){
                --r;
            }
            if (l < r){
                if (tolower(s[l]) != tolower(s[r])){
                    return false;
                }
                ++l;
                --r;
            }
        }
        return true;
    }
};

时间复杂度:O(N)
空间复杂度:O(1)

以上是关于《LeetCode之每日一题》:132.验证回文串的主要内容,如果未能解决你的问题,请参考以下文章

《LeetCode之每日一题》:65.最长回文子串

LeetCode每日一题刷题总结

leetcode每日一题:409. 最长回文串

leetcode刷题62.验证回文串——Java版

笔试强训之每日一题

《LeetCode之每日一题》:155.回文链表