给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama" 输出: true
示例 2:
输入: "race a car" 输出: false
代码一:java
class Solution {
public static boolean isPalindrome(String s) {
if(null==s||s.length()<2){//如果字符串的长度小于2,直接返回true
return true;
}
int size=s.length()-1;//记载的总长度
char left,right;//左右指针指向的字符
for(int i=0;i<s.length()-1;i++){//此处不使用size是因为size作为变量需要在下面进行实时修改
if(!isvalid(s.charAt(i))){//判断是否为需要判断的字符
continue;
}
left=s.charAt(i);
while(size>=0&&!isvalid(s.charAt(size))){//右角标大于0并且字符无效时,右指针左移
size--;
}
right=s.charAt(size);
if(!issame(left,right)){//判断左右角标对应的字符是否相等
return false;
}
size--;
}
return true;
}
public static boolean issame(char left, char right) {
if(left<65||right<65){//判断字符是否小于65
if(left==right){//小于65代表字符为数字,直接判断是否相等就可以了
return true;
}
}else{
if(left==right||Math.abs(left-right)==32){//字符大于等于65代表此处是字母,差值为32代表字母相等,一个是大写一个是小写
return true;
}
}
return false;
}
public static boolean isvalid(char c) {
if(c>='a'&&c<='z'||c>='A'&&c<='Z'||c>='0'&&c<='9'){
return true;
}
return false;
}
}
代码二:java
class Solution {
public boolean isPalindrome(String s) {
char[] cha = s.toCharArray();//将字符串对象中的字符转换为一个字符数组
int i = 0, j = cha.length - 1;
while(i < j){
if(!Character.isLetterOrDigit(cha[i]))
i++;
else if(!Character.isLetterOrDigit(cha[j]))
j--;
else
if(Character.toLowerCase(cha[i]) == Character.toLowerCase(cha[j])){
i++;
j--;
}else{
return false;
}
}
return true;
}
}