问题描述:
给定一个字符串,判断其是否为一个回文串。只包含字母和数字,忽略大小写。
样例:
"A man, a plan, a canal: Panama"
是一个回文。
"race a car"
不是一个回文。
注意:你是否考虑过,字符串有可能是空字符串?这是面试过程中,面试官常常会问的问题。
在这个题目中,我们将空字符串判定为有效回文。
挑战:O(n) 时间复杂度,且不占用额外空间。
算法思想:由于这个题中涉及到空格等符号字符,因此需设置头指针和尾指针,分别从前往后,从后往前找到非符号的字符;
public static boolean isPalindrome(String s) {
// Write your code here
boolean flag=true;
if(s==null){
return false;
}
if(s.length()==0){
return true;
}
int i=0;//相当于头指针
int j=s.length()-1;//相当于尾指针
while(i<s.length()&&i<=j){
//当i或j处不是字母或数字时,往后或者往前移动,直到遇到字母或数字;
if((((byte)s.charAt(i))<48||(((byte)s.charAt(i))>57&&((byte)s.charAt(i))<65)||(((byte)s.charAt(i))>90&&(((byte)s.charAt(i))<97)||((byte)s.charAt(i))>122))){
i++;
}
if((((byte)s.charAt(j))<48||(((byte)s.charAt(i))>57&&((byte)s.charAt(i))<65)||(((byte)s.charAt(j))>90&&(((byte)s.charAt(j))<97)||((byte)s.charAt(j))>122))){
j--;
}
//当i和j都表示字母或数字时;
if(i<s.length()&&i<=j){
//如果i和j处的ACSII码不相同或者相隔32,那么这两个字符肯定不匹配,则将flag设置为false,并跳出循环
if(((byte)s.charAt(i)!=(byte)s.charAt(j))){
if(((byte)s.charAt(i)!=(byte)s.charAt(j)+32)){
if((byte)s.charAt(i)!=(byte)s.charAt(j)-32){
flag=false;
break;
}
}
}
//否则,i往后移,j往前移
i++;
j--;
}
}
return flag;
}