125. 验证回文串

思路

  1. 首先枚举出字母和数字(orz…看了其他人的题解, 才想起来Character.isLetterOrDigit可以直接判断字符串是否字母或数字);
  2. 声明左指针指向入参第0位, 右指针指向入参最后一位, 用于判断左指针指向的元素(简称左元素)是否等于右指针指向的元素(简称右元素), 每遍历一次都会让左右指针往中间靠拢;
  3. 当左元素不是合法字符时, 左指针循环后移一位, 直到找到下一个合法字符; 右指针同理, 期间左指针不能超过右指针, 否则会下标越界/重复判断;
  4. 如果左指针和右指针已经指向同一位, 说明其他下标的元素都已相等;
  5. 使用字符串的api, 忽略大小写判断左元素和右元素是否相等, 如果不相等则直接返回false。

代码

class Solution {
    public boolean isPalindrome(String s) {
        // 忘记正则了, 枚举出所有字母和数值, 并转换为Set, 便于后续判断时间复杂度降为O(1)
        final String charStr = "QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm1234567890";
        int left = 0;
        int right = s.length() - 1;
        Set<Character> cs = new HashSet<>();
        for (int i = 0; i < charStr.length(); i++) {
            cs.add(charStr.charAt(i));
        }
        while (left < right) {
            // 左指针不是字母或数字, left < right条件避免下标越界
            while (!cs.contains(s.charAt(left)) && left < right) {
                left++;
            }
            // 右指针不是字母或数字
            while (!cs.contains(s.charAt(right)) && left < right) {
                right--;
            }
            // 如果已经减到超出了左右指针各自的范围, 说明前面的比较都通过了, 退出循环即可
            if (right == left) {
                break;
            }
            // 判断元素是否相等
            if (!String.valueOf(s.charAt(left)).equalsIgnoreCase(String.valueOf(s.charAt(right)))) {
                return false;
            }
            left++;
            right--;
        }
        return true;
    }
}

题目链接

125. 验证回文串

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值