LeetCode--125.验证回文串

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 。

示例 1:

输入: s = "A man, a plan, a canal: Panama"
输出:true
解释:"amanaplanacanalpanama" 是回文串。
示例 2:

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

1、遍历

创建一个空字符(数组),把字母数字放进去,然后判断这个字符串是不是回文
时间:o(n)
空间:o(n)

python:

class Solution:
    def isPalindrome(self, s: str) -> bool:
        s1 = ""
        for i in s:
            if i.islower() or i.isupper():
                i = i.upper()
                s1 += i
            if i.isdigit():
                s1 += i
        return s1 == s1[::-1]

java:

Character.isLetterOrDigit这个方法可以记一下

class Solution {
    public boolean isPalindrome(String s) {
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < s.length(); i++) {
            if (Character.isLetterOrDigit(s.charAt(i))) {
                sb.append(Character.toLowerCase(s.charAt(i)));
            }
        }
        // 一定要再新建一个sb
        StringBuilder sb_rev = new StringBuilder(sb).reverse();
        return sb_rev.toString().equals(sb.toString());  
    }
}

2、双指针

所谓双指针,相当于两处开始同时查找,可以直接在原字符串上判断,遇到非字母或者非数字直接跳过,前后指针遇到不同的字符直接返回false,遇到相同的字符同时向中间移动指针,如果指针相遇,则代表字符串是回文,最后返回true即可。
时间:o(n)、、、、、最坏为o(n)
空间:o(1)、、、、、原字符串判断,没有占用额外空间

python:

直接在原字符串判断,py字符串有个api判断字符串是否为字母或者数字isalnum

class Solution:
    def isPalindrome(self, s: str) -> bool:
        left = 0
        right = len(s) - 1
        while left <= right:
            if not s[left].isalnum():
                left+=1
            elif not s[right].isalnum():
                right-=1
            elif s[left].lower() != s[right].lower():
                return False
            else:
                left+=1
                right-=1
        return True

java:

java中遍历字符串出来是字符,Character.isLetterOrDigit判断字符是字母或者数字
Character.toLowerCase变为小写

class Solution {
    public boolean isPalindrome(String s) {
        int left = 0;
        int right = s.length() - 1;
        while (left <= right) {
            char ch_l = s.charAt(left), ch_r = s.charAt(right);
            if (!Character.isLetterOrDigit(ch_l)) {
                left++;
            }
            else if (!Character.isLetterOrDigit(ch_r)) {
                right--;
            }
            else if (Character.toLowerCase(ch_l) != Character.toLowerCase(ch_r)) {
                return false;
            }
            else {
                left++;
                right--;
            }
        }
        return true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值