力扣第125题-验证回文串

161 阅读2分钟

Offer 驾到,掘友接招!我正在参与2022春招打卡活动,点击查看活动详情

前言

力扣第125题 验证回文串 如下所示:

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

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

示例 1:

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

一、思路

题目非常简短,目的也很明确:验证目标字符串是否为回文字符串

需要题目中提到的 空字符认为是有效回文串,故我们需要特殊处理空字符串。此外,我们在验证字符串的时候只考虑子母、数字,并且需要忽略字母的大小写

假设目标字符串为 回文字符串,我们从字符串的两端向中间遍历,所遍历的每个字符串都应该相同(此处的相等是指忽略大小写的相等,例如 a == A

通过分析,很容易就能够想到使用 滑动窗口 来实现这一想法。先让滑动窗口的指向字符串的两端,然后逐步向中间靠近,直到滑动窗口的大小为 0,即滑动窗口的左端与右端相遇。

大致的步骤如下所示:

  1. 初始化滑动窗口,分别只想左右端
  2. 判断 leftright 指向的字符,有如下几种情况需要特殊处理(我这里将所有的小写字母转为大写字母比较)
    • 存在特殊字符
    • 存在小写字母()
  3. 窗口缩小过程中出现了不相等直接返回 false,反之返回 true

二、实现

实现代码

实现代码与思路中保持一致,但是为了判断边界更容易,我包装了一个方法来判断当前字符是否为以下的情况:

  • 数字
  • 小写字母
  • 大写字母
  • 其它字符
    public boolean isPalindrome(String s) {
        if (s == null)  // 特殊情况
            return true;
        int left = 0;
        int right = s.length() - 1;
        while (right > left){
            char lc = s.charAt(left);
            char rc = s.charAt(right);
            int lcType = cType(lc);
            int rcType = cType(rc);
            // 有一个特殊字符
            if (lcType < 0) {
                left++;
                continue;
            }
            if (rcType < 0) {
                right--;
                continue;
            }
            // 处理小写
            if (lcType == 3) lc -= 32;
            if (rcType == 3) rc -= 32;
            // 如不相等,则返回false
            if (lc != rc){
                return false;
            }
            left ++;
            right --;
        }
        return true;
    }

    /**
     * 获取字符的类型
     * 返回值介绍
     * 1:48 ~ 57 为数字
     * 2:65 ~ 90 为大写字母
     * 3:97 ~ 122 为小写字母
     * -1:其它字符
     */
    public int cType(char c){
        if (c >= 48 && c <= 57){
            return 1;
        }else if (c >= 65 && c <= 90){
            return 2;
        }else if (c >= 97 && c <= 122){
            return 3;
        } else {
            return -1;
        }
    }

测试代码

    public static void main(String[] args) {
        String s = "A man, a plan, a canal: Panama";
        new Number125().isPalindrome(s);
    }

结果

image.png

三、总结

jym,碰到这种简单题一定要自己写哦,不可多得的打基础的机会!

感谢看到最后,非常荣幸能够帮助到你~♥

如果你觉得我写的还不错的话,不妨给我点个赞吧!如有疑问,也可评论区见~