题目:
Given a string, determine if it is a palindrome, considering only alphanumeric characters and ignoring cases.
Note: For the purpose of this problem, we define empty string as valid palindrome.
Example 1:
Input: “A man, a plan, a canal: Panama”
Output: true
Example 2:
Input: “race a car”
Output: false
解答:
思路:
- 运用双指针i,j,分别记录左和右,对有效数字或字符进行依次比较。每次比较时,先判断是否为有限字符,再判断是否相等。
- 用isNumOrLetter(char s)方法判断该字符是否为数字字符或者为字母
- 用isSame(char left,char right)判断左右指针两个有效字符是否相等。
class Solution {
public boolean isPalindrome(String s) {
if(s==null||s.length()==1){
return true;
}
int i=0;
int j=s.length()-1;
while(i<j){
while(i<j&&!isNumOrLetter(s.charAt(i))){
i++;
}
while(i<j&&!isNumOrLetter(s.charAt(j))){
j--;
}
if(i<j&&!isSame(s.charAt(i),s.charAt(j))){
return false;
}
i++;
j--;
}
return true;
}
//根据ASCII码,判断是否为数字或者字母
private boolean isNumOrLetter(char s){
if((s>='A'&&s<='Z')||(s>='a'&&s<='z')||(s>='0'&&s<='9')){
return true;
}else{
return false;
}
}
//判断两个有效字符是否相等
private boolean isSame(char left,char right){
//判断数字是否相等
if((left>='0'&&left<='9')||(right>='0'&&right<='9')){
if(left==right){
return true;
}
//判断字母字符是否相等,其中大小写字母对应ASCII码差32
}else if(left==right||Math.abs(left-right)==32){
return true;
}
return false;
}
}