leetcode--125. 验证回文串

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

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

示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true

示例 2:
输入: “race a car”
输出: false

补充:C语言版本

bool isNum(char c) {
    if ((c >= '0' && c <= '9') || (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z')) {
        return true;
    }
    return false;
}
char toUpper(char c) {
    if (c >= 'a' && c <= 'z') {
        return c - 'a' + 'A';
    }
    return c;
}
bool isPalindrome(char * s){
    int len = strlen(s);
    int i = 0, j = len - 1;
    while (i < j) {
        if (!isNum(s[i])) {
            i++;
            continue;
        }
        if (!isNum(s[j])) {
            j--;
            continue;
        }
        if (toUpper(s[i]) != toUpper(s[j])) {
            return false;
        }
        i++;
        j--;
    }
    return true;
}
/*4ms,5.9MB*/

思路一:
创建一个新的字符串,只包含原字符串中的字母和数字字符,然后镜像对比

class Solution {
public:
    bool isPalindrome(string s) {
        int len = s.length();
        string temp = "";
        //删除非字母和数字字符,将小写字母转为大写
        for (int i=0; i<len; i++){
            if ((s[i] >= 'A' && s[i] <= 'Z') || (s[i] >= '0' && s[i] <= '9')){
                temp += s[i];
            } else if (s[i] >= 'a' && s[i] <= 'z'){
                temp += s[i] - 'a' + 'A';
            }
        }
        //镜像比较
        int len = temp.length();
        for (int k=0; k<len/2; k++){
            if (temp[k] != temp[len-1-k]){
                return false;
            }
        }
        return true;
    }
};

可以利用isalnum函数排除非字母数字,lower/tolower将所有字母转为小写,然后镜像对比处理后的字符串,代码会更精简

class Solution {
public:
    bool isPalindrome(string s) {
        string temp = "";
        //删除非字母和数字字符,将小写字母转为大写
        for (auto c : s){
            if (isalnum(c)){
                temp += tolower(c);
            } 
        }
        //镜像比较字符串
        int len = temp.length();
        for (int k=0; k<len/2; k++){
            if (temp[k] != temp[len-1-k]){
                return false;
            }
        }
        return true;
    }
};
/*12ms,9.8MB*/

复杂度分析:
时间复杂度:O(n),两次循环1.5n
空间复杂度:O(n),新增字符串最大长度灯源原字符串的长度

思路二:在原有字符串基础上,边判断是否是字母或数字字符,边镜像对比

class Solution {
public:
    bool isPalindrome(string s) {
        int len = s.length();
        int i = 0, j = len -1;
        while (i < j){
            if (!isalnum(s[i])){
                i++;
                continue;
            } 
            if (!isalnum(s[j])){
                j--;
                continue;
            } 
            if (s[i] != s[j]){
            	if (isdigit(s[i]) || isdigit(s[i]){
            		return false;
            	}
            	if (abs(s[i] - s[j]) != 32){
            	    return false;
            	}
            }
            i++;
            j--;
        }
        return true;
    }
};
/*8ms,9.5MB*/
class Solution {
public:
    bool isPalindrome(string s) {
        int i = 0, j = s.length() -1;
        while (i < j){
            if (!isalnum(s[i])){
                i++;
                continue;
            } 
            if (!isalnum(s[j])){
                j--;
                continue;
            } 
            //这样写更精简了,谁知道效率还低了4ms
            if (tolower(s[i]) != tolower(s[j])){
                return false;
            }
            i++;
            j--;
        }
        return true;
    }
};
/*12ms,9.5MB*/

复杂度分析:
时间复杂度:O(n),两次循环0.5n
空间复杂度:O(1),基本没有新增变量

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值