Leetcode——验证回文串

122 阅读1分钟

「这是我参与2022首次更文挑战的第26天,活动详情查看:2022首次更文挑战」。

前言

大家好,我是程序猿小白 gw_Gw,很高兴能和大家一起学习进步。

以下内容部分来自于网络,如有侵权,请联系我删除,本文仅用于学习交流,不用作任何商业用途。

摘要

本文主要介绍Leetcode的验证回文串的分析以及解法。

题目

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

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

 

示例 1:

输入: "A man, a plan, a canal: Panama" 输出: true 解释:"amanaplanacanalpanama" 是回文串

示例 2:

输入: "race a car" 输出: false 解释:"raceacar" 不是回文串  

提示:

1 <= s.length <= 2 * 105 字符串 s 由 ASCII 字符组成 相关标签 双指针 字符串

作者:力扣 (LeetCode) 链接:leetcode-cn.com/leetbook/re…

解法1

首先来看一个最简单的解法,先对给定的字符串进行处理,把除了字母和数字之外的字符全部替换掉,这里我们使用正则表达式最为简单。

  1. 构造正则表达式
  2. 将字符串转化为StringBuffer类型。
  3. 调用reverse()方法将两个字符串进行比较。
  4. 返回结果

【代码实现】

public static boolean isPalindrome1(String s){
    /*
    解法1:使用正则表达式
     */
    s=s.replaceAll("[^A-Za-z0-9]","").toLowerCase();
    String s1 = new StringBuffer(s).reverse().toString();
    return s.equals(s1);
}

解法2

这道题可以说是双指针的典型代表了,我们也可以使用双指针来解这道题。

思路:

  1. 设置双指针,分别指向字符串的头的尾。
  2. 移动双指针依次进行比较,一个向前移,一个向后移。
  3. 返回结果

【代码实现】

public static boolean isPalindrome(String s) {
    /*
    解法1:双指针
     */
    //如果是空串直接返回true
    if("".equals(s)){
        return true;
    }
    //先把所有字母转化为小写字母
    s=s.toLowerCase();
    int j=s.length()-1;
    for (int i = 0; i < j; i++,j--) {
        while(i<s.length()&&!((s.charAt(i)>='a' && s.charAt(i)<='z') ||(s.charAt(i)>='0'&&s.charAt(i)<='9'))){
            i++;
        }
        while(j>=0&&!((s.charAt(j)>='a' && s.charAt(j)<='z') ||(s.charAt(j)>='0'&&s.charAt(j)<='9'))){
            j--;
        }
        if(i<s.length()&&j>=0 &&s.charAt(i)!=s.charAt(j)){
            return false;
        }
    }
    return true;
}

我们还可以使用Java的API对上述代码进行优化,优化如下:

public static boolean isPalindrome(String s) {
    /*
    解法1:双指针
     */
    //如果是空串直接返回true
    if("".equals(s)){
        return true;
    }
    //先把所有字母转化为小写字母
    s=s.toLowerCase();
    int j=s.length()-1;
    //优化,使用java自带api
    for (int i = 0; i < j; i++,j--) {
        while(i<j&&!Character.isLetterOrDigit(s.charAt(i))){
            i++;
        }
        while(i<j&&!Character.isLetterOrDigit(s.charAt(j))){
            j--;
        }
        if(s.charAt(i)!=s.charAt(j)){
            return false;
        }
    }
    return true;
}

小结

以上就是关于Leetcode验证回文串的解法思想和具体代码,通过解题不仅可以让思维更加活跃,也可以让我们更加熟悉对应语言的使用,比如第二种解法我们的优化部分,相信大家都会越来越熟练的。

希望以上内容对大家有所帮助,如有不正之处,欢迎留言指正。