LeetCode(125)验证回文段

(125)验证回文段

Description:

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

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

示例1:

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

示例2:

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

思路:

其实整体思路也是首先将str过滤为只含有数字和字母,再将其全部大写/小写。最后检验其是否为回文段。

对于字符串过滤,目前想到三种方法:

  1. 使用filter来过滤无效字符,但没搞清楚如何既保留字母也保留数字只需要使用str.isalnum。(需要注意的是,filter所返回的是一个generator,即惰性迭代对象,需要使用*list()*来将其转化为list,再使用str.join()来append再string的后面)

  2. 最无脑的方法,遍历string,将符合要求的append在某空string上。

  3. 使用re.findall()来过滤。需要复习正则表达式

  4. 如果使用C的话,使用stack

  5. 使用双指针夹逼

代码:

  1. 使用*re.findall()*来进行过滤操作:
#44ms
class Solution:
    def isPalindrome(self, s: str) -> bool:
        import re
        s = ''.join(re.findall("(\w+)", s)).lower()
        return s == s[::-1]
  1. 利用filter来进行过滤:
#28ms
class Solution:
    def isPalindrome(self, s: str) -> bool:
        s = ''.join(list(filter(str.isalnum,s))).lower()
        return s == s[::-1]
  1. C语言利用stack进行判断:(粘贴了别人的代码)
bool isPalindrome(char * s){
    if(s == "")
        return 1;

    int len = strlen(s);
    char *stk = (char*)malloc(sizeof(char) * len);
    int top = -1, i;
    for(i = 0; i < len; i++){
        if(isupper(s[i])){
            stk[++top] = s[i] + 32;
        }
        else if(islower(s[i]) || isdigit(s[i])){
            stk[++top] = s[i];
        }
    }
    for(i = 0; i < len; i++){
        if(isupper(s[i])){
            char t = stk[top];
            if(s[i] + 32 != t)
                return 0;
            top--;
        }
        else if(islower(s[i]) || isdigit(s[i])){
            char t = stk[top];
            if(s[i] != t)
                return 0;
            top--;
        }
    }
    if(top >= 0)
        return 0;
    return 1;
}
/*
作者:zed-65536
链接:https://leetcode-cn.com/problems/valid-palindrome/solution/yan-zheng-hui-wen-chuan-c-by-zed-65536/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
*/
  1. 双指针速攻:(不是很快诶)
# 60ms 不是很快
class Solution:
    def isPalindrome(self, s: str) -> bool:
        i, j = 0, len(s) - 1
        while i < j:
            while i < len(s) and not s[i].isalnum():
                i += 1
            while j > -1 and not s[j].isalnum():
                j -= 1
            if i > j:
                return True
            if s[i].lower() != s[j].lower():
                return False
            else:
                i = i + 1
                j = j - 1
            return True
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值