LeetCode 0125. 验证回文串

Posted Tisfy

tags:

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

【LetMeFly】125.验证回文串

力扣题目链接:https://leetcode.cn/problems/valid-palindrome/

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

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

 

示例 1:

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

示例 2:

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

 

提示:

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

方法一:清洗字符串 + 判断

这种方法容易想到,但是空间复杂度稍微大一些

既然题目说只考虑字母数字,那么不如我们把字母数字提取出来,形成一个新串。

string strip(string& s) 
    string ans;
    for (char& c : s) 
        if (c >= 'a' && c <= 'z')
            ans += c;
        else if (c >= 'A' && c <= 'Z')  // 大写字母的话顺统一便转成小写(本题大小写不敏感)
            ans += (char)(c + 32);
        else if (c >= '0' && c <= '9')
            ans += c;
    
    return ans;

之后,再判断清洗过的字符串是否为回文串即可(从前往后变量半个字符,看第 i i i个和倒数第 i i i个字符是否相同)

bool isPalindrome(string& s) 
    s = strip(s);
    int n = s.size();
    for (int i = 0; i < n / 2; i++) 
        if (s[i] != s[n - i - 1])
            return false;
    
    return true;

  • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是字符串的长度
  • 空间复杂度 O ( N ) O(N) O(N)

AC代码

C++

class Solution 
private:
    string strip(string& s) 
        string ans;
        for (char& c : s) 
            if (c >= 'a' && c <= 'z')
                ans += c;
            else if (c >= 'A' && c <= 'Z')
                ans += (char)(c + 32);
            else if (c >= '0' && c <= '9')
                ans += c;
        
        return ans;
    
public:
    bool isPalindrome(string& s) 
        s = strip(s);
        int n = s.size();
        for (int i = 0; i < n / 2; i++) 
            if (s[i] != s[n - i - 1])
                return false;
        
        return true;
    
;

方法二:不开辟额外空间,直接忽略非字母数字的字符

这样没法直接确定前面第 i i i个字母数字对应的倒数第 i i i个字母数字是谁。

那么直接使用双指针,一个从前往后,一个从后往前,遇到非字母数字就忽略,直到前后指针重叠为止

  • 时间复杂度 O ( N ) O(N) O(N),其中 N N N是字符串的长度
  • 空间复杂度 O ( 1 ) O(1) O(1)

AC代码

C++

class Solution 
private:
    inline bool isCN(char c) 
        if (c >= 'A' && c <= 'Z')
            return true;
        if (c >= 'a' && c <= 'z')
            return true;
        if (c >= '0' && c <= '9')
            return true;
        return false;
    
public:
    bool isPalindrome(string s) 
        int l = 0, r = s.size() - 1;
        while (l < r) 
            // 找到下一个字母数字
            while (!isCN(s[l]) && l < r)
                l++;
            while (!isCN(s[r]) && l < r)
                r--;
            // 字母的话统一转为小写
            if (s[l] >= 'A' && s[l] <= 'Z')
                s[l] += 32;
            if (s[r] >= 'A' && s[r] <= 'Z')
                s[r] += 32;
            printf("l = %d, r = %d, s[%d] = %c, s[%d] = %c\\n", l, r, l, s[l], r, s[r]);  //**********
            if (s[l] != s[r])
                return false;
            l++, r--;
        
        return true;
    
;

同步发文于CSDN,原创不易,转载请附上原文链接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/125889961

以上是关于LeetCode 0125. 验证回文串的主要内容,如果未能解决你的问题,请参考以下文章

LeetCode-125-验证回文串

leetcode 验证回文串

leetcode 125. 验证回文串

前端与算法 leetcode 125. 验证回文串

LeetCode(125):验证回文串

[LeetCode] 125. 验证回文串