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

    代码:

  • 相关阅读:
    Codeforces 672D
    Codeforces 672C
    Codeforces 673D
    Codeforces 1181D
    Codeforces 1181C
    Codeforces 1011F
    Codeforces 1011E
    2020.1.3计导全面复习
    csp模拟题-201903
    CCF模拟题-201909
  • 原文地址:https://www.cnblogs.com/mcjhcnblogs/p/13162206.html
Copyright © 2020-2023  润新知