首页 > 编程语言 >【算法】【字符串】验证回文串

【算法】【字符串】验证回文串

时间:2024-01-21 20:56:03浏览次数:23  
标签:字符 leftIndex 字母 rightIndex 算法 && 字符串 回文

1  题目

如果在将所有大写字符转换为小写字符、并移除所有非字母数字字符之后,短语正着读和反着读都一样。则可以认为该短语是一个 回文串 。

字母和数字都属于字母数字字符。

给你一个字符串 s,如果它是 回文串 ,返回 true ;否则,返回 false 

示例 1:

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

示例 2:

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

示例 3:

输入:s = " "
输出:true
解释:在移除非字母数字字符之后,s 是一个空字符串 "" 。
由于空字符串正着反着读都一样,所以是回文串。

提示:

  • 1 <= s.length <= 2 * 105
  • s 仅由可打印的 ASCII 字符组成

2  解答

class Solution {
    public boolean isPalindrome(String s) {
        // 参数边界校验
        if (s == null || s.length() == 0) {
            return true;
        }
        // 因为有其他非字母字符存在,所以从中间往两边校验不行
        // 所以从两边向中间校验即可
        int leftIndex = 0;
        int rightIndex = s.length() - 1;
        // 左右指针
        while (leftIndex < rightIndex) {
            // 左指针 不是数字字母字符的略过
            while (leftIndex < rightIndex && !checkChar(s.charAt(leftIndex))) {
                leftIndex++;
            }
            // 右指针 不是数字字母字符的略过
            while (leftIndex < rightIndex && !checkChar(s.charAt(rightIndex))) {
                rightIndex--;
            }
            // 如果左指针小于右指针 
            if (leftIndex < rightIndex) {
                // 两者不相等的话 直接返回 false
                if (changeChar(s.charAt(leftIndex)) != changeChar(s.charAt(rightIndex))) {
                    return false;
                }
            }
            leftIndex++;
            rightIndex--;
        }
        // 遍历完说明是回文
        return true;
    }


    /**
     * 校验字符是不是字母
     */
    private boolean checkChar(char c) {
        return (c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') ? true : false;
    }

    /**
     * 转换字母统一为小写
     */
    private char changeChar(char c) {
        if ('A' <= c && c <= 'Z') {
            c = (char)(c + 32); 
        }
        return c;
    }
}

加油。

标签:字符,leftIndex,字母,rightIndex,算法,&&,字符串,回文
From: https://www.cnblogs.com/kukuxjx/p/17978344

相关文章

  • C++U6-03-最短路算法2-bellmon-ford算法
    学习目标贝尔曼福特算法、SPFA 可以用来复习的B站视频:1、https://www.bilibili.com/video/BV1RK4y1d7ct?p=3&vd_source=5c960e1ede940bc5cab8ed42c8bdc9372、https://www.bilibili.com/video/BV18a4y1A7gv/?spm_id_from=333.999.0.0 SPFA算法是 Bellman-Ford算法 的队......
  • 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题
    七、用go语言,假设用RB-INSERT将一个结点x插入一棵红黑树,紧接着又用RB-DELETE将它从树中删除。结果的红黑树与初始的红黑树是否一样?证明你的答案。文心一言:首先,我们需要明确RB-INSERT和RB-DELETE的基本操作。RB-INSERT的基本步骤如下:将新节点插入到红黑树的某个位置。重新平......
  • 排序算法的性能比较
    写在前面菜鸡博主最近放寒假了,打算接下来的一段时间内回顾一下以前学过的一些知识,也是为考研做一些准备吧。很菜,勿喷,希望能和大家一起学习,共同进步!主要目标和具体要求目标排序对于数据处理是一项十分重要和基础的工作。采用如下算法实现排序功能:插入排序、交换排序、选择排序......
  • 文心一言 VS 讯飞星火 VS chatgpt (183)-- 算法导论13.4 7题
    七、用go语言,假设用RB-INSERT将一个结点x插入一棵红黑树,紧接着又用RB-DELETE将它从树中删除。结果的红黑树与初始的红黑树是否一样?证明你的答案。文心一言:首先,我们需要明确RB-INSERT和RB-DELETE的基本操作。RB-INSERT的基本步骤如下:将新节点插入到红黑树的某个位置。重......
  • 一种计数算法
    前言常见的一个问题:给定一个整形数组,统计其中有多少唯一的元素.常见的思路有哪些呢?元素去重并统计,利用哈希表进行去重计数.数组排序后统计以上空间复杂度均与元素数量关联,如果允许损失精度,是否可以使用较低的空间占用来统计呢?利用布隆过滤器是一种的一种但......
  • 算法学习Day36重叠区间
    Day36重叠区间ByHQWQF2024/01/21笔记435.无重叠区间给定一个区间的集合,找到需要移除区间的最小数量,使剩余区间互不重叠。注意:可以认为区间的终点总是大于它的起点。区间[1,2]和[2,3]的边界相互“接触”,但没有相互重叠。示例1:输入:[[1,2],[2,3],[3,4],[1......
  • Java将字符串转为list数组
    将字符串转为list数组的实现方法概述在Java开发中,有时候我们需要将一个字符串转换为一个列表数组,以便对其中的元素进行操作和处理。本文将介绍一种常见的实现方法,并提供详细的步骤和示例代码来帮助你完成这个任务。实现步骤下面是实现将字符串转为list数组的一般步骤,你可以按照......
  • Java将json字符串转换为数组的方法
    Java将json字符串转换为数组的方法在Java开发中,经常会遇到将json字符串转换为数组的需求。JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式,常用于前后端数据传输和存储。而Java中的JSONArray类可以用来处理json数组。下面将介绍一种常用的方法,用于将json字符串转换为......
  • Java获取两个字符串日期的间隔天数
    Java获取两个字符串日期的间隔天数1.概述在Java中,要计算两个字符串日期之间的间隔天数,首先需要将字符串日期转换为java.util.Date对象,然后通过对比两个Date对象的时间戳计算出间隔天数。2.实现步骤步骤描述步骤1将字符串日期转换为java.util.Date对象步骤2获取......
  • Java如何过滤掉一段字符串中出现重复的字母或数字?
    可以使用Java中的HashSet来去除一段字符串中出现重复的字母或数字。HashSet是一个不允许有重复元素的集合,因此可以利用它的特性来去除重复的字符或数字。示例代码如下:importjava.util.HashSet;publicclassRemoveDuplicates{publicstaticvoidmain(String[]args){......