valid palindrome(回文)

Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.

For example,
"A man, a plan, a canal: Panama" is a palindrome.
"race a car" is not a palindrome.

判断一个字符串是否是回文字符串,该字符串由数字和字母组成,字母不区分大小写。如果字符串中有其他字符,则跳过这些字符,不用管这些字符。。空串假设是回文。

 

1.自己的解法。。将不符合要求的字符去除,也就是将符合要求的字符另外存起来成为合法字符串,这里用StringBuilder,然后不区分大小写比较合法字符串和它的反串是否相等。StringBuilder有reverse方法,String没有。

public boolean isPalindrome(String s) {
        //先将子母和数字找出来存放起来,用StringBuilder,然后不考虑大小写比较该串和它的反转串,因为StringBuilder有reverse方法,String没有。
        if(s==null) return true;
        StringBuilder sb=new StringBuilder();
        for(int i=0;i<s.length();i++){
            char ch=s.charAt(i);
            if(ch<='z'&&ch>='a'||ch<='Z'&&ch>='A'||ch<='9'&&ch>='0')
                sb.append(ch);
        }
        
        String s1=sb.toString();
        return s1.toLowerCase().equals(sb.reverse().toString().toLowerCase());
    }

2、上面去除不符合要求的步骤可以使用正则表达式

public boolean isPalindrome(String s) {
        //正则表达式,将所有非子母和数字的字符用“” 代替,然后还是要比较该串和它的反转串,所以还是需要用StringBuilder最后存字符串。
        //这里相对于上面就是用正则表达式来替换那些没用的字符了
        if(s==null) return true;
        String s1=s.replaceAll("[^A-Za-z0-9]","").toLowerCase();
        String rev=new StringBuilder(s1).reverse().toString();
        return s1.equals(rev);
    }

3、直接比较,从头尾开始比较字符是否相等,跳过不合法字符。这种方法最快。

这里用到了Character的一些方法
 public boolean isPalindrome(String s) {
        //直接比较了,先不去掉不合法的字符,也不转成反串。直接从两头比较,跳过不合法的字符,这里用到了Character的一些方法
        if(s==null) return true;
        int start=0,end=s.length()-1;
        while(start<end){
            char st=s.charAt(start);
            if(!Character.isLetterOrDigit(st))  {start++; continue;}//跳过不符合要求的
             char e=s.charAt(end);
            if(!Character.isLetterOrDigit(e))  {end--;continue;}
            if(Character.toLowerCase(st)!=Character.toLowerCase(e)) return false;
            start++;
            end--;
        }
        return true;
    }

 

posted on 2017-12-21 20:09  夜的第八章  阅读(130)  评论(0编辑  收藏  举报

导航