面试经典150题——验证回文串

news2024/9/22 17:28:19

​"Challenges are what make life interesting and overcoming them is what makes life meaningful." - Joshua J. Marine

1. 题目描述

2. 题目分析与解析

在解决这个问题之前我们先想一下普通的回文串是如何判断的。

  • 方法1:通过将字符串反转,来判断两个字符串是否相等。

  • 方法2:双指针,一个从前向后,一个从后向前,判断字符是否相等。

而现在的题目只是在判断普通回文串的基础上加上了一些无关紧要的字符,那我们是不是就可以将该问题分解成:

  • 将无关紧要的字符去掉(对应reverse原始字符串的方法),或者不考虑他(对应双指针方法)

  • 在判断是否为回文串

因此有了上述思路就可以写代码了。

3. 代码实现
 


// 双指针方法
public boolean isPalindrome(String s) {
    // 解题思路
    // 1. 大写字符转换为小写字符、并移除所有非字母数字字符(但无需真正移除,只需要在遍历时如果非字母就略过)
    // 2. 双指针判断是否为回文串
    // 3. 时间复杂度O(n)
    // 4. 空间复杂度O(1)
    // 5. 代码实现

    // 1. 大写字符转换为小写字符
    String lowerCase = s.toLowerCase();
    // 2. 双指针判断是否为回文串
    int left = 0;
    int right = s.length() - 1;
    while (left < right) {
        // 2.1. 如果不是字母数字字符,跳过
        if (!Character.isLetterOrDigit(lowerCase.charAt(left))) {
            left++;
            continue;
        }
        if (!Character.isLetterOrDigit(lowerCase.charAt(right))) {
            right--;
            continue;
        }
        // 2.2. 如果不相等,返回false
        if (lowerCase.charAt(left) != lowerCase.charAt(right)) {
            return false;
        }
        // 2.3. 移动指针
        left++;
        right--;
    }
    return true;
}

// 反转字符串
public boolean isPalindrome2(String s) {
    StringBuffer clearStr = new StringBuffer();
    int length = s.length();
    for (int i = 0; i < length; i++) {
        char ch = s.charAt(i);
        // 删除无关紧要的字符
        if (Character.isLetterOrDigit(ch)) {
            clearStr.append(Character.toLowerCase(ch));
        }
    }
    // 反转字符串
    StringBuffer sgood_rev = new StringBuffer(clearStr).reverse();
    // 判断是否为回文串
    return clearStr.toString().equals(sgood_rev.toString());
}

代码相关注释已经比较清晰的解释了不在赘述。

4. 运行结果

5. 相关复杂度分析

1. 反转字符串

  • 时间复杂度:O(n),其中 n 是字符串 s 的长度。

  • 空间复杂度:O(n)。由于我们需要将所有的字母和数字字符存放在另一个字符串中,在最坏情况下,新的字符串与原字符串 s 完全相同,因此需要使用 O(n) 的空间。

2. 双指针

  • 时间复杂度:O(n),其中 n  是字符串 s 的长度。

  • 空间复杂度:O(1)。

顺便推广一下个人公众号:
 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1431104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

UnityShader(十四)纹理

目录 前言&#xff1a; 单张纹理实现效果&#xff1a; 效果&#xff1a; 前言&#xff1a; 纹理最初的目的是用一张图片来控制模型的外观。使用纹理映射技术我们可以把一张图“贴”在模型表面&#xff0c;逐纹素&#xff08;文素的名字是为了和像素进行区分&#xff09;控制…

2024 Google Chrome 浏览器回退安装旧版本

2024 Google Chrome 浏览器回退安装旧版本 查看当前谷歌版本备份浏览器数据卸载浏览器双击重新安装旧版本浏览器 查看当前谷歌版本 详细参考&#xff1a;参考 笔记&#xff1a;最近谷歌浏览器更新后&#xff0c;用着总感觉别扭&#xff1a;不习惯 备份浏览器数据 &#xff…

鸿蒙(HarmonyOS)项目方舟框架(ArkUI)之MenuItem组件

鸿蒙&#xff08;HarmonyOS&#xff09;项目方舟框架&#xff08;ArkUI&#xff09;之MenuItem组件 一、操作环境 操作系统: Windows 10 专业版、IDE:DevEco Studio 3.1、SDK:HarmonyOS 3.1 二、MenuItem组件 TextClock组件通过文本将当前系统时间显示在设备上。支持不同时…

假期2.3

第二章 引用内联重载 一&#xff0e;选择题-* 1、适宜采用inline定义函数情况是&#xff08;C&#xff09; A. 函数体含有循环语句 B. 函数体含有递归语句‘、考科一 ’ C. 函数代码少、频繁调用 D. 函数代码多、不常调用 2、假定一个函数为A(int i4, int j0) {;}, 则执行“A …

09. BI - 数据可视化,如何进行基本图形绘制

本文为 「茶桁的 AI 秘籍 - BI 篇 第 09 篇」 文章目录 EDA 作用可视化视图Python 进行可视化subplot Hi&#xff0c;你好。我是茶桁。 今天想给大家讲的是关于数据的可视化。在工作中很多时候我们不光要计算结果&#xff0c;还要把结果呈现出来&#xff0c;最好是一种图形化的…

MATLAB知识点:矩阵的加法

​讲解视频&#xff1a;可以在bilibili搜索《MATLAB教程新手入门篇——数学建模清风主讲》。​ MATLAB教程新手入门篇&#xff08;数学建模清风主讲&#xff0c;适合零基础同学观看&#xff09;_哔哩哔哩_bilibili 节选自第3章 3.4.2 算术运算 首先是矩阵的加法。在线性代数中…

软考19-上午题-栈和队列

栈、队列&#xff0c;都是线性结构 一、栈 1-1、栈的定义 只能通过访问他的一端来实现数据的存储和检索的线性结构。 特点&#xff1a;先进后出 不含数据元素的栈——空栈。 栈的典型应用&#xff0c;递归。 1-2、栈的存储结构 1-2-1、栈的顺序存储——顺序栈 可以用数组实…

SpringBoot注解--06--注解@Validated

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1 简述1.1 Validated作用1.2 所有参数注解含义1.3 异常处理1.4 Valid和Validated比较Valid级联校验 2.Validated 分组校验1.1为何要分组校验&#xff1f;1.2 代码案…

ERP 系统架构的设计与实践总结

企业资源计划&#xff08;ERP&#xff09;系统是一种集成多个业务功能的综合性软件解决方案。在设计和实践 ERP 系统架构时&#xff0c;需要考虑诸多因素&#xff0c;以确保系统能够满足企业的需求&#xff0c;并提供高效、可靠、安全的服务。本文将介绍一些关键的设计原则和实…

2023年全球软件开发大会(QCon上海站2023):核心内容与学习收获(附大会核心PPT下载)

在信息化和全球化日益加速的今天&#xff0c;软件开发技术日新月异&#xff0c;对全球各行各业产生了深远影响。2023年全球软件开发大会&#xff08;QCon上海站2023&#xff09;无疑成为行业内外瞩目的焦点。本次大会汇集了全球顶级的软件开发专家、企业领袖、研究者&#xff0…

Filter与Listener(Java Web)

Filter与Listener(Java Web) 概念&#xff1a;Filter表示过滤器&#xff0c;是JavaWeb三大组件(Servlet、Filter、Listener)之一。过滤器可以把对资源的请求拦截下来&#xff0c;从而实现一些特殊的功能。过滤器一般完成一些通用的操作&#xff0c;比如&#xff1a;权限控制、…

Hudi学习 6:Hudi使用

准备工作&#xff1a; 1.安装hdfs https://mp.csdn.net/mp_blog/creation/editor/109689143 2.安装spark spark学习4&#xff1a;spark安装_hzp666的博客-CSDN博客 3.安装Scala Hudi学习6&#xff1a;安装和基本操作_hzp666的博客-CSDN博客 spark-shell 写入和读取hudi 2.…

鸿蒙应用开发-自定义可删除列表弹窗

功能介绍&#xff1a; 自定义列表弹窗&#xff0c;可以对弹窗的列表点击删除&#xff0c;参考文档创建列表&#xff0c;自定义弹窗文档自定义弹窗&#xff08;CustomDialog&#xff09;。 知识点&#xff1a; 熟悉对List控件的使用。熟悉对List点击删除熟悉自定义弹窗。 使…

2024美赛C题完整解题教程及代码 网球运动的势头

2024 MCM Problem C: Momentum in Tennis &#xff08;网球运动的势头&#xff09; 注&#xff1a;在网球运动中&#xff0c;"势头"通常指的是比赛中因一系列事件&#xff08;如连续得分&#xff09;而形成的动力或趋势&#xff0c;这可能对比赛结果产生重要影响。球…

【Unity知识点详解】自定义程序集

今天来介绍一下Unity中的自定义程序集。在项目开发中我们经常接触到第三方插件的程序集&#xff0c;如DOTween、Newtonsoft.Json等。 使用自定义程序集有这么几个好处&#xff1a; 方便代码的的复用。当某一功能模块需要在多个项目中重复使用时&#xff0c;可以将代码编译成程…

canvas设置图形各种混合模式,类似photoshop效果

查看专栏目录 canvas实例应用100专栏&#xff0c;提供canvas的基础知识&#xff0c;高级动画&#xff0c;相关应用扩展等信息。canvas作为html的一部分&#xff0c;是图像图标地图可视化的一个重要的基础&#xff0c;学好了canvas&#xff0c;在其他的一些应用上将会起到非常重…

树莓派zero/zero w的区别

直观区别 1、zero没有WiFi和蓝牙模块&#xff0c;当然也没有网线接口&#xff0c;适合不需要网络的场景需求。 2、zero w带有WiFi和蓝牙模块&#xff0c;没有网线接口。适合需要网络的场景需求。 选购建议 我一般都是看有没有网络接口或者WiFi支持&#xff08;一定要选择焊接…

未来电话呼叫技术的社会影响与发展趋势----云微呼

未来电话呼叫技术将以更为智能化、便捷化和个性化为主要发展趋势&#xff0c;其所带来的社会影响也将是多层面的。以下将探讨未来电话呼叫技术可能的发展趋势以及对社会的影响&#xff1a; 智能化助力生活便捷&#xff1a; 未来电话呼叫技术将更加智能化&#xff0c;通过人工智…

《计算机网络简易速速上手小册》第10章:未来网络技术趋势(2024 最新版)

文章目录 10.1 边缘计算与网络设计 - 未来网络的速度与激情10.1.1 基础知识10.1.2 重点案例&#xff1a;使用 Python 实现边缘计算的实时视频分析准备工作Python 脚本示例 10.1.3 拓展案例1&#xff1a;智能交通系统Python 脚本示例 - 边缘计算设备上的交通流量分析 10.1.4 拓展…

牛客网 OR76 两个整数二进制位不同个数

前提需备知识&#xff1a; 算法&#xff1a;n&&#xff08;n-1&#xff09;是用来求n中1的个数 常用代码形式为&#xff1a; while(n){count;nn&(n-1); //每次减去1的个数} 关于该算法的推导可以见http://t.csdnimg.cn/Tld2S&#xff0c;本文就不再赘述 思路&…