题目
验证回文串
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写
说明:本题中,我们将空字符串定义为有效的回文串
示例 1:
输入: “A man, a plan, a canal: Panama”
输出: true
解释:“amanaplanacanalpanama” 是回文串
示例 2:
输入: “race a car”
输出: false
解释:“raceacar” 不是回文串
思路
- 双指针,
i
从前往后扫,j
从后往前扫,碰到非数字和字母的跳过去; - 判断相对应的
i
字符和j
字符是否相等。
public static boolean isPalindrome(String s) {
//双指针
char[] str = s.toCharArray();
int i = 0;
int j = s.length() - 1;
while (i < j){
//遇到非数字和字母就跳过去
if (!isAlpha(s.charAt(i))){ //此处用if和continue搭配,效果和while一样,为了把i<j抽取出来,所以用if
i++;
continue;
}
if (!isAlpha(s.charAt(j))){
j--;
continue;
}
//到这里剩下的就都是数字和字符了,判断是否相等
if (toLower(s.charAt(i)) != toLower(s.charAt(j))){
return false;
} else {
//相等的话继续比较下一个
i++;
j--;
}
}
return true;
}
//判断是否是数字或字母
private static boolean isAlpha(char c){
if (c >= '0' && c <= '9') return true;
if (c >= 'A' && c <= 'Z') return true;
if (c >= 'a' && c <= 'z') return true;
return false;
}
//大写转小写
private static char toLower(char c){
if (c >= '0' && c <= '9') return c;
if (c >= 'a' && c <= 'z') return c;
return (char)((int)c + 32);
}