Leetcode 125. 验证回文串

151 阅读2分钟

# Leetcode 125. 验证回文串

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情

1、题目📑

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

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

实例1

输入: "A man, a plan, a canal: Panama"

输出: true

解释:"amanaplanacanalpanama" 是回文串

实例2

输入: "race a car"

输出: false

解释:"raceacar" 不是回文串

限制

  • 1 <= s.length <= 2 * 105
  • 字符串 s 由 ASCII 字符组成

2、思路🧠

方法一:双指针

  1. 将字符串统一字符小写,全部转为小写字母
  2. 使用双指针,一个字符串头部,一个字符串尾部,进行比较
  3. 循环判断
    • 如果字符串为数字或者为小写字母,则进行比较
    • 否则 字符串头部 后移操作,字符串尾部 前移操作
    • 发现一个条件不满足直接返回false
  4. 如果以上条件都判断完成,结束循环,则为符合条件,返回 true

方法二:java内置API进行操作,reverse反转判断

  1. 循环遍历并判断:依次取得每个字符串得单个字符
    • 判断该字符是否是小写字母或者数字,满足条件则通过 StringBufferappend() 进行追加。
    • 判断该字符是否是大写字母,满足条件则通过 Character.toLowerCase(c) 转化为小写,通过 StringBufferappend() 进行追加。
  2. 将得到新的字符串保存
  3. 对新的字符串进行反转操作,对两次的字符串进行 compareTo 操作。

废话少说~~~~~上代码!

3、代码👨‍💻

第一次commit AC

class Solution {
    public boolean isPalindrome(String s) {
        s = s.toLowerCase();
        int l = s.length();
        int i = 0,j = l - 1;
        while(i <= j) {
            char ci = s.charAt(i);
            char cj = s.charAt(j);
            if(!(Character.isDigit(ci) || (ci >= 'a' && ci <= 'z'))) {
                i++;continue;
            }
            if(!(Character.isDigit(cj) || (cj >= 'a' && cj <= 'z'))){
                j--;continue;
            }

            if(ci != cj) return false;

            i++;
            j--;
        }
        return true;
    }
}

时间复杂度:O(N) N 为是字符串的长度

空间复杂度:O(1)

第二次commit AC

class Solution {
    public boolean isPalindrome(String s) {
        StringBuffer sb = new StringBuffer();
        for(int i = 0; i < s.length() - 1; i++) {
            char c = s.charAt(i);
            if(Character.isDigit(c) || Character.isLowerCase(c)) {
                sb.append(c);
            }else if (Character.isUpperCase(c)){
                sb.append(Character.toLowerCase(c));
            }
        }
        String new_String = sb.toString();
        String reverse_String = new StringBuilder(new_String).reverse().toString();
        return (new_String.compareTo(reverse_String) == 0);
    }
}

时间复杂度:O(N) N 为是字符串的长度

空间复杂度:O(N)

image-20220407112916156

4、总结

该题目的对字符串的判断,清楚字符串的各种api操作,并且熟练运用进行字符串和字符的灵活变换操作。

字符串常用API

方法描述
public String substring(int beginIndex, int endIndex)截取一串字符串的一串子字符串,从from位置的字母(包括from)到end(不包括end位置)的字符串。
Integer.valueOf(str);字符串不能强转为int型,需要通过Integer.valueOf();转换为int型
public String trim()去除字符串开头和结尾的空字符(空格,tab等)
public char charAt(int index)返回char指定索引处的值。
public String[] split(String regex)将str字符串以"regex"为条件进行分割
public String toLowerCase()将所有在此字符String使用默认语言环境的规则,以小写。
public String toUpperCase()将所有在此字符String使用默认语言环境的规则,以大写。

字符常用API

方法描述
public static boolean isDigit(char ch)确定指定的字符是否是数字。
public static boolean isLetter(char ch)确定指定的字符是否是一个字母。
public static boolean isLetterOrDigit(char ch)确定指定的字符是字母还是数字。
public static boolean isLowerCase(char ch)确定指定的字符是否是小写字符。
public static boolean isUpperCase(char ch)确定指定的字符是否为大写字符。

❤️‍来自专栏《LeetCode基础算法题》欢迎订阅❤️‍

厂长写博客目的初衷很简单,希望大家在学习的过程中少走弯路,多学一些东西,对自己有帮助的留下你的赞赞👍或者关注➕都是对我最大的支持,你的关注和点赞给厂长每天更文的动力。

对文章其中一部分不理解,都可以评论区回复我,我们来一起讨论,共同学习,一起进步!

原题链接: 125. 验证回文串 - 力扣(LeetCode) (leetcode-cn.com)