一、题目
给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。
说明:本题中,我们将空字符串定义为有效的回文串。
示例 1:
输入: "A man, a plan, a canal: Panama"
输出: true
示例 2:
输入: "race a car"
输出: false
二、解题思路
做过回文的题目,我比较喜欢用的方法,就是直接将字符串中的特殊字符啥的直接删除,然后将字符串中的字母转化为小写或者大写,之后使用StringBuffer将字符串的顺序颠倒,然后进行对比,如果相同则为true否则为false
三、代码如下:
public static boolean isPalindrome(String s) { // 正则表达式,除了数字和字母外的其他字符 String regEx="[^A-Za-z0-9]"; // 统一转化为小写,替换所有空格 String sc = s.toLowerCase().replaceAll(regEx, ""); System.out.println(sc); StringBuffer sb = new StringBuffer(sc); String sl = sb.reverse().toString(); if(sc.equals(sl)){ return true; } return false; }
代码效率:
四、补充
基于字符串的处理看似很简单但是执行效率真的不高,所以提供另一种方法为采用双指针的方法,先将字符串中的字母全部转化为小写,之后通过下标,采用双指针和charAt的方法来,遍历字符串中的每一个字符,只要是为特殊字符下标就继续向中间移动,直到两个都为字母之后就开始比较,如果不相同返回false,直到全部相同,返回true,代码如下:
public boolean isPalindrome(String s) { String sc = s.toLowerCase(); int left = 0; int right = sc.length() - 1; while(left < right){ // 判断如果不是数字和字母指针就继续向中间移动 while(left < right && !Character.isLetterOrDigit(sc.charAt(left))){ left++; } // 判断如果不是数字和字母指针就继续向中间移动 while(left < right && !Character.isLetterOrDigit(sc.charAt(right))){ right--; } // 判断是否相同 if(sc.charAt(left) != sc.charAt(right)){ return false; } left++; right--; } return true; }
代码: