lintcode 415有效回文串(Java)

来源:互联网 发布:手机版弘历软件 编辑:程序博客网 时间:2024/06/07 10:14

题目

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 && i<j) {                i++;            }            while (Character.isLetterOrDigit(chars[j]) == false && i<j) {                j--;            }            if (chars[i] != chars[j]){                return false;            }        }        return true;    }}

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

原创粉丝点击