leedcode做题总结,题目Valid Palindrome 2013/01/12

本文介绍了一种高效的方法来判断给定字符串是否为回文串,通过将字符串转换为字符数组并从两端同时比较元素,从而实现快速判断。讨论了如何忽略大小写和特殊字符,以及使用字符转大写简化比较过程。

这道题思路很简单,把字符串拆成单个字符,过滤掉非数字字母,留下的数组从前和后同时开始比对,如果出现不同则非回文。

注意的有,题目中不区分大小写,Aa也是回文,所以判断时不能只是用char来==,还要判断差的绝对值是否为32。

还有如果while中优势需要i++的可以直接用a[i++]即可,但是要注意if的条件里不要出现两次a[i++]


还有就是记住 '0'-'9'==48-57

'A'-'Z'==65-90

'a'-'z'==97-122


还有如果不用分隔出来单词,要分隔出字符,使用charAt()比split("")好用


public static boolean isPalindrome(String s) {
        int num=s.length();
        char[] sa = new char[num];
        int j=0;
        for (int i = 0; i <num ; i++) {
            if(s.charAt(i)>47&&s.charAt(i)<58) sa[j++]=s.charAt(i);
            else if(s.charAt(i)>64&&s.charAt(i)<91) sa[j++]=s.charAt(i);
            else if(s.charAt(i)>96&&s.charAt(i)<123) sa[j++]=s.charAt(i);
        }
        int i=0;
        j--;

        while (i<j){
            if(sa[i]!=sa[j]&&Math.abs(sa[i]-sa[j])!=32) return false;
            i++;
            j--;
        }
        return true;
    }

Update 2015/08/18: 上面的做法新建了一个char数组其实是没有必要的,下面的做法将所有字符判断前先转为大写不如直接用绝对值差32判断简介,同时要注意‘A’-32返回的是int 不是char


public class Solution {
    /**
     * @param s A string
     * @return Whether the string is a valid palindrome
     */
    public boolean isPalindrome(String s) {
        // Write your code here
        if (s.equals(""))
            return true;
        int i = 0;
        int j = s.length()-1;
        while (i <= j){
            if (s.charAt(i) < '0'||(s.charAt(i) > '9' && s.charAt(i) < 'A') || (s.charAt(i) > 'Z' && s.charAt(i) < 'a')
                || s.charAt(i) > 'z'){
                    i++;
                    continue;
            }
            if (s.charAt(j) < '0'||(s.charAt(j) > '9' && s.charAt(j) < 'A') || (s.charAt(j) > 'Z' && s.charAt(j) < 'a')
                || s.charAt(j) > 'z'){
                    j--;
                    continue;
            }
            int a = s.charAt(i) > 96 ? s.charAt(i) - 32: s.charAt(i);
            int b = s.charAt(j) > 96 ? s.charAt(j) - 32: s.charAt(j);
            if (a != b)
                return false;
            else {
                i++;
                j--;
            }
            
        }
        return true;
    }
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值