给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
用前后指针的方法可以提高效率,就是一个i 从前走,遇到非法字符就跳过,一个j 从后走,遇到非法字符就跳过,字符合法,就比较两个字符,相等,或相差32 的都通过,遇到不符合要求的就返回 false ,没有遇到不符合要求的就返回true 。
法一
/**
* ASCII 码 A + 32 = a ,大写与小写差32 个
* 0 是48 所以9 是57 例如5 是53
*/
public boolean isPalindrome(String s) {
if (s == null)
return false;
if (s.length()<=1)
return true;
char[] charArr = s.toCharArray();
int i = 0,j = charArr.length-1;
// 这里i < j 就可以
while (i<j){
if (!isIeg(charArr[i])){
i++;
continue;
}
if (!isIeg(charArr[j])){
j--;
continue;
}
if (isOk(charArr[i],charArr[j])){
i++;
j--;
continue;
}
return false;
}
return true;
}
private static boolean isIegal(char c){
if ((48<=c&& c<=57) ||
(65<=c&& c<=90) ||
(97<=c&& c<=122)){
return true;
}else {
return false;
}
}
private static boolean isOk(char a,char b){
if (a == b)
return true;
if ((48<=a && a<=57) || (48<=b && b<=57))
return false;
if ((a - b) == 32)
return true;
if ((b - a) == 32)
return true;
return false;
}
法二
public boolean isPalindrome(String s){
if (s == null) return false;
s = s.toLowerCase();
int i = 0,j = s.length()-1;
while (i<j){
while (i<j && !isIegalChar(s.charAt(i)))
i++;
while (i<j && !isIegalChar(s.charAt(j)))
j--;
// 两指针碰面还没有发现问题,则说明是回文串
if (i >= j)
return true;
if (s.charAt(i) != s.charAt(j))
return false;
i++;
j--;
}
return true;
}
private boolean isIegalChar(char c){
return ('0' <= c && c <= '9')|| ('a' <= c && c <= 'z');
}