刷题系列之125. 验证回文串

91 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

前言

题目来源

leetcode.cn/leetbook/re…

题目介绍

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

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

题目分析

首先应该知道什么是回文串

“回文串”是一个正读和反读都一样的字符串,初始化标志flag=true,比如“level”或者“noon”等等就是回文串。

题目告知应忽略字符空格和字母大小写,验证回文串,把字符串转成字符数组,那么这个数组应该从下标0开始往后的元素和下标从最大值开始后往前的元素值应该一样。因此采用双指针解法。

题目解答

class Solution {
    public boolean isPalindrome(String s) {
            //把字符串 转为小写
            String str = s.toLowerCase();
               //把字符串转化为一个数组
        char[] chars = str.toCharArray();
        //起始位置下标
        int l=0;
        //尾部位置下标
        int r=chars.length-1;
        //只要起始位置下标小于右边位置下标 就执行
        while (l<r){
            //先遍历左边位置是不是字母或者数组
            while (!Character.isLetter(chars[l])
            &&!Character.isDigit(chars[l])){
                l++;
                if (l==chars.length-1) return true; //如果全部都是符号,返回true
            }
            //判断右边位置是不是字母或者数字
            while (r>0&&!Character.isLetter(chars[r])&&!Character.isDigit(chars[r])){
                r--;
            }
            //存在字母和数字,比较左边和右边 位置 元素,如果不等 肯定是false
            if (chars[l]!=chars[r]) return false;
            //递增一个
            l++;
            //递减一个,保证对比位置是左边第一个等于右边第一个
            r--;
        }
        return true;

    }
}

先对左边和右边元素 做判断,依次左边和右边对比,直到2边位置下标位置不满足l<r,退出循环。如果都满足chars[l]=chars[r] 那么肯定是回文串了。执行如下

image.png

官方答案验证

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sgood = new StringBuffer();
        int length = s.length();
        for (int i = 0; i < length; i++) {
            char ch = s.charAt(i);
            if (Character.isLetterOrDigit(ch)) {
                sgood.append(Character.toLowerCase(ch));
            }
        }
        StringBuffer sgood_rev = new StringBuffer(sgood).reverse();
        return sgood.toString().equals(sgood_rev.toString());
    }
}

官方这种比较取巧了,用了字符串的一些api,把字符串翻转,和最先的字符串比较 是否相等一目了然,这种确实很方便哈。

image.png

总结

原来这样的字符串叫回文串,我也是才知道有这个名称哈,相对来说是比较好理解的,从数组角度出发,可以很快证明一个字符串是不是一个回文串。