125. Valid Palindrome

题目描述

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

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

示例 1:

输入: "A man, a plan, a canal: Panama"
输出: true

示例 2:

输入: "race a car"
输出: false

我的解法——修改字符串后遍历(AC)

  • 遍历字符串,将数字和字母提取出来一个新的字符串,然后遍历新的字符串来判断是否是回文串。
  • 时间空间复杂度均为O(n)。
  • Beat44%
class Solution:
    def isPalindrome(self, s):
        """
        :type s: str
        :rtype: bool
        """
        length = len(s)
        s = s.lower()
        ss = s
        s = ''
        for now in ss:
            if((now >= 'a' and now <= 'z') or(now >= 'A' and now <= 'Z') or (now >= '0' and now <= '9')):
                s += now
        length = len(s)
        for i in range(int(length/2)):
            if(s[i] != s[length - i - 1]):
                return False
        return True

最优解法——双指针遍历

  • 定义两个指针 L, R,分别从开始和最后的点开始遍历,每次取符合条件的字符,然后判断,这样没有额外的空间复杂度
  • 时间复杂度O(n),空间复杂度O(1)
class Solution {
public:
    bool isPalindrome(string s) {
        int len = s.length();
        int l = 0, r = len - 1;
        while(l < r){
            while(l < r){
                if((s[l] >= 'a' && s[l] <= 'z') || (s[l] >= '0' && s[l] <= '9') || (s[l] >= 'A' && s[l] <= 'Z')){
                    if(s[l] >= 'A' && s[l] <= 'Z'){
                        s[l] = s[l] - 'A' + 'a';
                    }
                    break;
                }
                l++;
            }
            while(r > l){
                if((s[r] >= 'a' && s[r] <= 'z') || (s[r] >= '0' && s[r] <= '9') ||(s[r] >= 'A' && s[r] <= 'Z')){
                    if(s[r] >= 'A' && s[r] <= 'Z'){
                        s[r] = s[r] - 'A' + 'a';
                    }
                    break;
                }
                r--;
            }
            if(s[l] != s[r]){
                return false;
            }
            l++;
            r--;
        }
        return true;
    }
};