leetcode算法-验证回文串

一、题目

给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。

说明:本题中,我们将空字符串定义为有效的回文串。

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

代码:

原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13162206.html