题目:
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;
}
}