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.
由于含有特殊字符,所以不能按数组下标i,length -i 来判断字符是否相等,而需要前后设两个指针,移动到有效字符时判断。注意alphanumeric包含字母和数字。
Source
public class Solution {
public boolean isPalindrome(String s) {
int k,p;
s = s.toLowerCase();<span style="white-space:pre"> </span>//将string中的所有大写字母转换为小写字母 toUpperCase转大写
k = 0;
p = s.length() - 1; //注意减1
while(k < p)
{
while(k < s.length() && !isLetter(s.charAt(k)))
k++;
while(p > 0 && !isLetter(s.charAt(p)))
p--;
if(k >= p) return true; //‘ ; . ,算回文
if(s.charAt(k) != s.charAt(p))
return false;
else{
k++;
p--;
}
}
return true;
}
public boolean isLetter(char i){
if((i >= 'a' && i <= 'z') || (i >= '0' && i <= '9')){ //alphanumeric characters 包括数字
return true;
}
return false;
}
}
Test
public static void main(String[] args){
String s = new String("race a car");
System.out.println(new Solution().isPalindrome(s));
}