LeetCode | Valid Palindrome

100 篇文章 0 订阅
9 篇文章 0 订阅

Given a string, determine if it is a palindrome, considering only
alphanumeric characters and ignoring cases.

For example, “A man, a plan, a canal: Panama” is a palindrome. “race a
car” is not a palindrome.

Note: Have you consider that the string might be empty? This is a good
question to ask during an interview.

For the purpose of this problem, we define empty string as valid
palindrome.

这道题坑点很多,包括跳过特殊字符,忽略大小写等等。
然后这些都考虑到了,发现TLE了,于是:
1、将大小写统一
2、使用哈希表加速字符类型判断
终于没有TLE了但是时间依然很长

class Solution {
public:
    bool isPalindrome(string s) {
        int n=s.size();
        unordered_map<char,bool> map;
        //全部小写化
        for(int i=0;i<n;i++){
            if(s[i]>='A' && s[i]<='Z') s[i]=s[i]-'A'+'a';
        }
        //利用哈希表加速判断
        for(char c='a';c<='z';c++) map[c]=true;
        for(char c='0';c<='9';c++) map[c]=true;

        int left=0,right=n-1;
        while(left<right){
            if(map.find(s[left])==map.end()){ left++;continue;}
            if(map.find(s[right])==map.end()){ right--;continue;}
            if(s[left]==s[right]){
                left++;right--;
            }
            else return false;
        }
        return true;
    }
};

看讨论区里面,速度较快的是拿库函数做的,卧槽还可以这么玩….
在正式代码里面如果想使用string 和isalnum/tolower等函数,需要分别引入

#include< string>

#include< ctype.h>

using namespace std;

class Solution {
public:
    bool isPalindrome(string s) {
        int n=s.size();
        int left=0,right=n-1;
        while(left<right){
            while(!isalnum(s[left]) && left<right) left++;
            while(!isalnum(s[right]) && left<right) right--;
            if(tolower(s[left++])!=tolower(s[right--]))
            return false;
        }
        return true;
    }
};
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值