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; }