LeetCode - 125. Valid Palindrome

题目:

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


思路与步骤:

首先理解题目要求:通过测试样例得知,输入的字符串只比较大小写字母和0-9,并且忽略大小写。于是有两种思路

思路1:

先将元字符串中的有效字符提取出来,并且将大写转化为小写存入一个List中,然后对List中的各个元素依次比较。

思路2:

设两个指针(在Java中也就是两个下标值),无效字符直接跳过,有效字符转化为小写后比较。这样不需要先将元字符存入List 而一遍进行。

具体方法也有以下几种:

1. 在判断有效字符时有两种方法,第一种是分别判断大写字母、小写字母、0-9数字;另一种是用 Character.isLetterOrDigit(c)直接判断。然后在用 Character.toLowerCase(c)) 全部转换成小写。

2. 在思路1中,存入List 之后可以依次首尾比较,也可以直接用 Collections.reverse(list2) 方法,但这里要注意的是,

初始化 list2 的时候不能 List<Character> list2 = list;  而要List<Character> list2 = new ArrayList<Character>(list);


程序实现:

思路1:

方法1

public class Solution {
    public boolean isPalindrome(String s) {
        List<Character> list = new ArrayList<Character>();
        //method 1-1: faster
        for(char c: s.toCharArray()){
            if(('0'<=c && c<='9'))    list.add(c);
            else if('a'<=c && c<='z')    list.add(c);
            else if(('A'<=c && c<='Z'))    list.add(Character.toLowerCase(c));
        }
        //for(char c: s.toCharArray())    if(Character.isLetterOrDigit(c))    list.add(Character.toLowerCase(c));
        if(list.size()==0 || list.size()==1) return true;
        int i=0, j=list.size()-1;
        while (i<j-1 && list.get(i++)==list.get(j--));
        if((i==j-1 && list.get(i)==list.get(j)) || (i==j && list.get(i-1)==list.get(j+1))) return true;
        else return false;
    }
}

方法2

public class Solution {
    public boolean isPalindrome(String s) {
        List<Character> list = new ArrayList<Character>();
        for(char c: s.toCharArray()){
            if(('0'<=c && c<='9'))    list.add(c);
            else if('a'<=c && c<='z')    list.add(c);
            else if(('A'<=c && c<='Z'))    list.add(Character.toLowerCase(c));
        }
        //for(char c: s.toCharArray())    if(Character.isLetterOrDigit(c))    list.add(Character.toLowerCase(c));
        List<Character> list2 = new ArrayList<Character>(list);
        Collections.reverse(list2);
        return list.equals(list2);
    }
}

思路2:

public class Solution {
    public boolean isPalindrome(String s) {
        //Do not store in a list first.
        if(s.length()==0) return true;
        int i=0, j=s.length()-1;
        while (i<=j){
            if(!Character.isLetterOrDigit(s.charAt(i))) i++;
            else if(!Character.isLetterOrDigit(s.charAt(j))) j--;
            else{
                if(Character.toLowerCase(s.charAt(i)) == Character.toLowerCase(s.charAt(j)))    return false;
                else{
                    i++;
                    j--;
                }
            }
        }
        return true;
    }
}


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章