LeetCode--Valid Palindrome

相似题目:

Palindrome Number

Valid PalinDrome

Reverse Linked List

  Palindrome Linked List

 

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.

Note:
Have you consider that the string might be empty? This is a good question to ask during an interview.

For the purpose of this problem, we define empty string as valid palindrome.

问题描述:给出一个字符串,判断是否为回文,只考虑数字和字符,并且忽略大小写。注意:你考虑到空字符串了吗?这是一个你面试时可以向考官提问的好问题。在这里,我们认为空字符串也是回文。

问题解决:首先将原来字符串预处理,将无关的标点符号去除,并且全部大写转化为小写;得出字符串的总长度,分偶数跟奇数两种情况处理。分别用第一个vs最后一个,第二个vs倒数第二个,……这样一次比较,判断是否为回文。

代码如下:

public class Solution {
    public boolean isPalindrome(String s) {
        if(s==null)
            return true;
        if(s.length()==0)
            return true;
        s = s.toLowerCase();
        char[] ch = s.toCharArray();
        ArrayList<Character> l = new ArrayList<Character>();
        for(int i=0; i<ch.length; i++){
            if(ch[i]>='a' && ch[i]<='z' || ch[i]>='0'&&ch[i]<='9'){
                l.add(ch[i]);
            }
        }
        
        if(l.size()==0)
            return true;
        
        int r = l.size()%2;
        int t = l.size()/2;
        
        if(r==0){ //是偶数
            if(!l.get(t-1).equals(l.get(t)))
                return false;
            else{
                for(int i=0; i<t-1; i++){
                    if(!l.get(i).equals(l.get(l.size()-i-1)))
                        return false;
                }
                return true;
            }
        }
        
        else{ //是奇数
            for(int i=0; i<t; i++){
                if(!l.get(i).equals(l.get(l.size()-i-1)))
                    return false;
            }
            return true;
        }
    }
}

 

 解法二:可以看到,在上面的解法中使用了数组,ArrayList等额外空间,时间复杂度为O(n),空间复杂度为O(n)。一种改进的方法是直接在原来字符串上操作,一个首指针,一个尾指针,如果当前所指是字母或者数字,则比较并移动,如果最后可以重合,则该字符串是回文。

 

public class Solution {
    
    public boolean isValid(char c){
        if(c<='z'&&c>='a' || c>='0'&&c<='9')
            return true;
        else
            return false;
    }   
    
    public boolean isPalindrome(String s) {
        if(s==null)
            return true;
        if(s.length()==0)
            return true;
        s = s.toLowerCase();
        char[] ch = s.toCharArray();
        
        int i = 0, j = ch.length-1;
        
        while(i!=j&&i<=ch.length-1&&j>=0){
            if(isValid(ch[i])&&isValid(ch[j])){
                if(ch[i]!=ch[j])
                    return false;
                i++;
                j--;
            }
            else if(!isValid(ch[i]))
                i++;
            else if(!isValid(ch[j]))
                j--;
            else{
                i++;
                j--;
            }
                
        }
        return true;
        
    }
}

 

posted @ 2015-05-25 09:56  江湖小妞  阅读(184)  评论(0编辑  收藏  举报