LeetCode题解java算法:125. 验证回文串

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

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

示例 1:

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

示例 2:

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

控制反转解法:

class Solution {
    public boolean isPalindrome(String s) {
        //StringBuffer对象的初始化不像String类的初始化一样,Java提供的有特殊的语法,而通常情况下一般使用构造方法进行初始化。   
        StringBuffer buffer = new StringBuffer();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            char ch = s.charAt(i);
            //如果字符是字母或数字此方法返回true,否则为false。  去除空格,符号等。
            if (Character.isLetterOrDigit(ch)) {
                //将纯字母和数字字符存储到可变字符串中
                buffer.append(Character.toLowerCase(ch));
            }
        }
        //将数据buffer进行反转  进行比较判断是否相等
        StringBuffer buffer_reverse = new StringBuffer(buffer).reverse();
        return buffer.toString().equals(buffer_reverse.toString());
    }
}

双指针

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer buffer = new StringBuffer();
        int len = s.length();
        for (int i = 0; i < len; i++) {
            char ch = s.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                buffer.append(Character.toLowerCase(ch));
            }
        }
        int n = buffer.length();
        int left = 0, right = n - 1;
        //toLowerCase() 方法将字符串转换为小写。
        while (left < right) {
            if (Character.toLowerCase(buffer.charAt(left)) != Character.toLowerCase(buffer.charAt(right))) {
                return false;
            }
            ++left;
            --right;
        }
        return true;
    }
}

优化后:双指针

class Solution {
    public boolean isPalindrome(String s) {
        int n = s.length();
        int left = 0, right = n - 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) {
                if (Character.toLowerCase(s.charAt(left)) != Character.toLowerCase(s.charAt(right))) {
                    return false;
                }
                ++left;
                --right;
            }
        }
        return true;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值