LintCode_有效回文串

问题描述:

给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。

样例:
"A man, a plan, a canal: Panama"  是一个回文。 "race a car"  不是一个回文。

注意:你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。

在这个题目中,我们将空字符串判定为有效回文。

挑战:O(n) 时间复杂度,且不占用额外空间。


算法思想:由于这个题中涉及到空格等符号字符,因此需设置头指针和尾指针,分别从前往后,从后往前找到非符号的字符;
    public static  boolean isPalindrome(String s) {
        // Write your code here
        
        boolean flag=true;
        
        if(s==null){
            return false;
        }
        
        if(s.length()==0){
            return true;
        }
        
        int i=0;//相当于头指针
        int j=s.length()-1;//相当于尾指针

        while(i<s.length()&&i<=j){
            
            //当i或j处不是字母或数字时,往后或者往前移动,直到遇到字母或数字;
            if((((byte)s.charAt(i))<48||(((byte)s.charAt(i))>57&&((byte)s.charAt(i))<65)||(((byte)s.charAt(i))>90&&(((byte)s.charAt(i))<97)||((byte)s.charAt(i))>122))){
                i++;
            }
            if((((byte)s.charAt(j))<48||(((byte)s.charAt(i))>57&&((byte)s.charAt(i))<65)||(((byte)s.charAt(j))>90&&(((byte)s.charAt(j))<97)||((byte)s.charAt(j))>122))){
                j--;
            }
            
            //当i和j都表示字母或数字时;
            if(i<s.length()&&i<=j){
                //如果i和j处的ACSII码不相同或者相隔32,那么这两个字符肯定不匹配,则将flag设置为false,并跳出循环
                if(((byte)s.charAt(i)!=(byte)s.charAt(j))){
                    if(((byte)s.charAt(i)!=(byte)s.charAt(j)+32)){
                        if((byte)s.charAt(i)!=(byte)s.charAt(j)-32){
                            flag=false;
                            break;
                        }
                    }   
                }
                
                //否则,i往后移,j往前移
                i++;
                j--;
            }

        }
        return flag;
        
    }



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值