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.
判断一个字符串是否是回文字符串,该字符串由数字和字母组成,字母不区分大小写。如果字符串中有其他字符,则跳过这些字符,不用管这些字符。。空串假设是回文。
1.自己的解法。。将不符合要求的字符去除,也就是将符合要求的字符另外存起来成为合法字符串,这里用StringBuilder,然后不区分大小写比较合法字符串和它的反串是否相等。StringBuilder有reverse方法,String没有。
public boolean isPalindrome(String s) {
//先将子母和数字找出来存放起来,用StringBuilder,然后不考虑大小写比较该串和它的反转串,因为StringBuilder有reverse方法,String没有。
if(s==null) return true;
StringBuilder sb=new StringBuilder();
for(int i=0;i<s.length();i++){
char ch=s.charAt(i);
if(ch<='z'&&ch>='a'||ch<='Z'&&ch>='A'||ch<='9'&&ch>='0')
sb.append(ch);
} String s1=sb.toString();
return s1.toLowerCase().equals(sb.reverse().toString().toLowerCase());
}
2、上面去除不符合要求的步骤可以使用正则表达式
public boolean isPalindrome(String s) {
//正则表达式,将所有非子母和数字的字符用“” 代替,然后还是要比较该串和它的反转串,所以还是需要用StringBuilder最后存字符串。
//这里相对于上面就是用正则表达式来替换那些没用的字符了
if(s==null) return true;
String s1=s.replaceAll("[^A-Za-z0-9]","").toLowerCase();
String rev=new StringBuilder(s1).reverse().toString();
return s1.equals(rev);
}
3、直接比较,从头尾开始比较字符是否相等,跳过不合法字符。这种方法最快。
这里用到了Character的一些方法
public boolean isPalindrome(String s) {
//直接比较了,先不去掉不合法的字符,也不转成反串。直接从两头比较,跳过不合法的字符,这里用到了Character的一些方法
if(s==null) return true;
int start=0,end=s.length()-1;
while(start<end){
char st=s.charAt(start);
if(!Character.isLetterOrDigit(st)) {start++; continue;}//跳过不符合要求的
char e=s.charAt(end);
if(!Character.isLetterOrDigit(e)) {end--;continue;}
if(Character.toLowerCase(st)!=Character.toLowerCase(e)) return false;
start++;
end--;
}
return true;
}