原题:
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.
思路:
“双指针大法”,字符串首尾各用一个指针向中间遍历,遇到非法字符则跳过,否则判断是否相等,若不等则必定不是回文,直到两个指针相遇为止。由于题目要求不区分大小写字母,因此可以将原字符串统一转化成小写字母处理。另外还需要一个根据ASCII码判断字符是否合法的辅助函数(是否为数字或小写字母)。
代码(Java):
public class Solution {
public boolean isLegicalCharacter(char input) //判断一个字符是否为数字或小写字母
{
int int2 = (int) input;
if(int2 < '0' || int2 > 'z') //注意,ASCII码中 0-9 和a-z中间不连续
{
return false;
}
else if(int2 > '9' && int2 <'a')
{
return false;
}
return true;
}
public boolean isPalindrome(String s)
{
if(s.equals("")||s.equals(null))
{
return true;
}
int i = 0;
int j = s.length() -1;
String s_low = s.toLowerCase(); //因为不区分大小写,全部转换成小写字母进行简化
while(i < j)
{
while( !isLegicalCharacter(s_low.charAt(i)) &&(i!=j) ) //遇到非法字符则跳过
{
i++;
}
while( !isLegicalCharacter(s_low.charAt(j))&&(i!=j) ) //遇到非法字符则跳过
{
j--;
}
if(s_low.charAt(i)!=s_low.charAt(j))
{
return false;
}
else
{
i++;
j--;
}
}
return true;
}
}