lintcode 415有效回文串(Java)

题目

1.题目
给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
2.注意事项
你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
3.例子
在这个题目中,我们将空字符串判定为有效回文。
样例
“A man, a plan, a canal: Panama” 是一个回文。
“race a car” 不是一个回文。

解法1

解法分析:
首先我们要将字符串s中的非字母数字元素剔除,用到了Character.isLetter(c),Character.isDigit(c)分别判断是否是字母、数字,Character.isLetterOrDigit(c) 判断是否是字母或数字;
然后将获得的字符串转为小写,并转成char[];
最后进行遍历判断。

public class Solution {
    /**
     * @param s A string
     * @return Whether the string is a valid palindrome
     */
    public boolean isPalindrome(String s) {
        StringBuffer buffer = new StringBuffer();
        for (char c : s.toCharArray()){
            //判断是否是字母或者数字
            if (Character.isLetterOrDigit(c)){
                buffer.append(c);
            }
        }
       //转成全是小写的char数组
        char[] chars  = buffer.toString().toLowerCase().toCharArray();
        int n = chars.length;
        //遍历到一半就行
        for (int i = 0; i < n/2; i++){

            if (chars[i] != chars[n - i - 1]){
                return false;
            }
        }
        return true;
    }
}

解法2

进一步分析:本题目是典型的使用对撞指针的题目,上面的解法并没有很好的使用这一点,只是单纯的重新筛选组合,相比来讲,下面的这个更好。

public class Solution {
    /**
     * @param s A string
     * @return Whether the string is a valid palindrome
     */
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        char[] chars = s.toCharArray();
        for(int i = 0, j = s.length() - 1; i < j; i++, j--){

            while (Character.isLetterOrDigit(chars[i]) == false && iwhile (Character.isLetterOrDigit(chars[j]) == false && iif (chars[i] != chars[j]){
                return false;
            }
        }

        return true;
    }
}

题目地址:http://www.lintcode.com/zh-cn/problem/valid-palindrome/

你可能感兴趣的:(java,算法)