算法笔记-验证回文串

验证回文串

问题:

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

说明:

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

思路:
  1.筛选后判断,对字符串s进行一次遍历,判断每个字符是否为字母或数字,并且统一为小写(或大写)存入新字符串,最后比较新字符串和其翻转是否一致。 时间O(n) 空间 O(n)

  有一点要特别注意,Stringbuilder的equals()方法继承自Object,需要将其转换为String类对象才能比较属性值。

代码实现:

class Solution {
    public boolean isPalindrome(String s) {
        if (s.length() == 0) return true;
        int len = s.length();
        //获取每个字符
        char c;
        StringBuilder sb = new StringBuilder();
        for (int i = 0; i < len; i++) {
            c = s.charAt(i);
            //判断是否是字母或数字
            if (Character.isLetterOrDigit(c))
                //统一大小写
                sb.append(Character.toLowerCase(c));
        }
        //String类中的equals才比较值
        return sb.toString().equals(sb.reverse().toString());
    }
}

  2.在原字符串上直接判断,直接在原字符串上使用双指针,每次向另一个指针方向移动到下一个字母或者数字字符处,判断统一大小写后是否相同,直到两个指针重合。 时间 O(n) 空间 O(1)

代码实现:

class Solution {
    public boolean isPalindrome(String s) {
        if (s.length() == 0) return true;
        int len = s.length();
        //双指针
        int left = 0, right = len - 1;
        //一直移动到两指针相遇
        while (left < right) {
            //找到有效字符
            while (left < right && !Character.isLetterOrDigit(s.charAt(left)))
                left++;
            while (left < right && !Character.isLetterOrDigit(s.charAt(right)))
                right--;
            //指针未重合才比较
            if (left < right) {
                //统一大小写,不相等直接false
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right)))
                    return false;
                //相等则继续走
                left++;
                right--;
            }
        }
        return true;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值