字符串及其反转中是否存在同一子字符串:深入解析与解决方案

news2024/12/27 11:40:34

字符串及其反转中是否存在同一子字符串:深入解析与解决方案

在字符串处理和算法设计中,查找特定模式的子字符串是一项常见且重要的任务。今天,我们将探讨一个有趣的问题:判断一个字符串中是否存在一个长度为2的子字符串,在其反转后的字符串中也出现。这个问题不仅考验了我们的字符串操作能力,还涉及了高效算法的设计。

问题描述

题目编号:3083

标题:字符串及其反转中是否存在同一子字符串

难度:简单

相关标签:字符串,哈希表

相关企业:未指定

题目

给你一个字符串 s ,请你判断字符串 s 是否存在一个长度为 2 的子字符串,在其反转后的字符串中也出现。

如果存在这样的子字符串,返回 true;如果不存在,返回 false

示例 1:
输入:s = "leetcode"
输出:true
解释:子字符串 "ee" 的长度为 2,它也出现在 reverse(s) == "edocteel" 中。
示例 2:
输入:s = "abcba"
输出:true
解释:所有长度为 2 的子字符串 "ab"、"bc"、"cb"、"ba" 也都出现在 reverse(s) == "abcba" 中。
示例 3:
输入:s = "abcd"
输出:false
解释:字符串 s 中不存在满足「在其反转后的字符串中也出现」且长度为 2 的子字符串。
提示:
  • 1 <= s.length <= 100
  • 字符串 s 仅由小写英文字母组成。

解题思路

为了判断字符串 s 中是否存在一个长度为2的子字符串,其反转后的字符串也在 s 中出现,我们可以采取以下步骤:

  1. 遍历字符串 s:对于每一个可能的长度为2的子字符串,提取并进行反转。

  2. 检查反转后的子字符串是否存在于原字符串 s

  3. 优化:为了提高效率,可以使用哈希表(如集合)存储所有长度为2的子字符串,以便快速查找。

不过,由于字符串长度限制在100以内,直接遍历和检查的时间复杂度也是可以接受的。因此,以下提供了一个简单且有效的解决方案。

代码实现

class Solution:
    def isSubstringPresent(self, s: str) -> bool:
        n = len(s)
        for i in range(n - 1):
            # 提取长度为2的子字符串
            a = s[i:i+2]
            # 反转子字符串并检查是否存在于原字符串中
            if a[::-1] in s:
                return True
        return False

代码解析

让我们逐步解析上述代码的工作原理:

  1. 获取字符串长度

    n = len(s)
    

    这一步是为了确定遍历的范围,避免索引越界。

  2. 遍历字符串,提取子字符串

    for i in range(n - 1):
        a = s[i:i+2]
    

    由于我们需要提取长度为2的子字符串,因此遍历范围是从0n-2

  3. 反转子字符串并检查存在性

    if a[::-1] in s:
        return True
    

    a[::-1]用于反转子字符串。如果反转后的子字符串在原字符串 s 中存在,则立即返回 True

  4. 如果遍历结束后未找到符合条件的子字符串,返回 False

    return False
    

示例解析

示例 1

  • 输入:s = "leetcode"
  • 提取的子字符串及其反转:
    • “le” -> “el” (不在 s 中)
    • “ee” -> “ee” (在 s 中)
  • 由于子字符串 “ee” 的反转 “ee” 存在于 s 中,返回 True

示例 2

  • 输入:s = "abcba"
  • 提取的子字符串及其反转:
    • “ab” -> “ba” (在 s 中)
    • “bc” -> “cb” (在 s 中)
    • “cb” -> “bc” (在 s 中)
    • “ba” -> “ab” (在 s 中)
  • 多个子字符串满足条件,返回 True

示例 3

  • 输入:s = "abcd"
  • 提取的子字符串及其反转:
    • “ab” -> “ba” (不在 s 中)
    • “bc” -> “cb” (不在 s 中)
    • “cd” -> “dc” (不在 s 中)
  • 无子字符串满足条件,返回 False

时间复杂度分析

  • 时间复杂度:O(n^2)

    在最坏情况下,对于每个长度为2的子字符串,我们需要检查它的反转是否存在于字符串 s 中。字符串的 in 操作在平均情况下是O(n),因此整体时间复杂度为O(n^2)。

  • 空间复杂度:O(1)

    只使用了常数级别的额外空间。

由于题目中字符串的最大长度为100,时间复杂度在这个范围内是可以接受的。

优化思路

尽管当前的解决方案已经足够高效,但我们仍可以尝试优化时间复杂度:

  1. 使用哈希表存储所有长度为2的子字符串

    • 预先遍历一次字符串,存储所有长度为2的子字符串到一个集合中。
    • 然后再遍历一次,检查每个子字符串的反转是否在集合中。
  2. 时间复杂度优化

    • 通过使用集合,查找操作可以从O(n)优化到O(1),从而将整体时间复杂度降为O(n)。

优化后的代码

class Solution:
    def isSubstringPresent(self, s: str) -> bool:
        n = len(s)
        substr_set = set()
        # 存储所有长度为2的子字符串
        for i in range(n - 1):
            substr_set.add(s[i:i+2])
        
        # 检查反转后的子字符串是否存在
        for substr in substr_set:
            reversed_substr = substr[::-1]
            if reversed_substr in substr_set:
                return True
        return False

优化后的时间复杂度

  • 时间复杂度:O(n)

    两次遍历字符串,每次都是O(n),因此总时间复杂度为O(n)。

  • 空间复杂度:O(n)

    需要存储所有长度为2的子字符串,最多有O(n)个。

结论

通过本文的解析,我们了解了如何判断一个字符串中是否存在一个长度为2的子字符串,其反转后的字符串也在原字符串中出现。初始的双重遍历方法虽然简单,但通过使用哈希表的优化,我们成功将时间复杂度从O(n^2)降至O(n),提高了算法的效率。

这种问题在实际应用中具有广泛的意义,例如在生物信息学中的基因序列分析,或是在文本处理中的模式匹配等领域。掌握高效的字符串处理技巧,将为解决更复杂的问题奠定坚实的基础。


如果您对本篇文章有任何疑问或建议,欢迎在评论区留言讨论!

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

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

相关文章

使用DynadotAPI查看域名清仓中的过期域名列表

前言 Dynadot是通过ICANN认证的域名注册商&#xff0c;自2002年成立以来&#xff0c;服务于全球108个国家和地区的客户&#xff0c;为数以万计的客户提供简洁&#xff0c;优惠&#xff0c;安全的域名注册以及管理服务。 Dynadot平台操作教程索引&#xff08;包括域名邮箱&…

uni-app 中使用微信小程序第三方 SDK 及资源汇总

&#x1f380;&#x1f380;&#x1f380;uni-app 跨端开发系列 &#x1f380;&#x1f380;&#x1f380; 一、uni-app 组成和跨端原理 二、uni-app 各端差异注意事项 三、uni-app 离线本地存储方案 四、uni-app UI库、框架、组件选型指南 五、uni-app 蓝牙开发 六、uni-app …

探索 Pencils Swap 的叙事:为 DeFi 的再次爆发蓄力

Pencils Protocol 最初是 Scroll 生态上一个综合性的 DeFi 平台&#xff0c;以 Farming、Vaults 以及 Auction 等系列产品板块为基础&#xff0c;其不仅成为了 Scroll 上重要的流动性、收益枢纽&#xff0c;同时也是重要的 LaunchPad 市场以及流量池&#xff0c;为 Scroll 生态…

基于STM32单片机矿井矿工作业安全监测设计

基于STM32单片机矿井矿工作业安全监测设计 目录 项目开发背景设计实现的功能项目硬件模块组成设计思路系统功能总结使用的模块技术详情介绍总结 1. 项目开发背景 随着矿井矿工作业环境的复杂性和危险性逐渐增加&#xff0c;矿井作业安全问题引起了社会各界的广泛关注。传统的…

数学建模与数学建模竞赛

什么是数学建模&#xff1f; 数学建模是通过数学的方法和工具&#xff0c;对现实世界的一个特定对象&#xff0c;依据其内在规律&#xff0c;做出一些必要的简化假设&#xff0c;从而建立一个数学结构的过程。数学建模的历史和数学的起源几乎同步开始&#xff0c;2000多年前&a…

stm32四联七段数码管,LED8*8点阵

一、七段数码管的整体代码和仿真 1&#xff09;代码 seg74.c #include "stm32f10x.h" // Device headervoid seg74_init(void) {GPIO_InitTypeDef GPIO_InitStruct;RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);RCC_APB2PeriphClockCmd(…

SpringCloudAlibaba技术栈-Dubbo

1、什么是Dubbo? 简单来说&#xff0c;dubbo就像是个看不见的手&#xff0c;负责专门从注册中心nacos调用注册到nacos上面的服务的&#xff0c;因为在微服务环境下不同的功能模块可能在不同的服务器上。dubbo调用服务就像是在调用本地的服务一样。 分布式调用与高并发处理 Du…

“AI智能安全管理系统:让安全无处不在

嘿&#xff0c;大家好&#xff01;今天咱们来聊聊一个超级酷炫又至关重要的东西——AI智能安全管理系统。想象一下&#xff0c;如果有一个系统可以像私人保镖一样24小时不间断地保护你和你的财产&#xff0c;是不是感觉特别安心&#xff1f;这就是AI智能安全管理系统带给我们的…

【hackmyvm】soul靶机wp

tags: HMVrbash绕过图片隐写PHP配置解析 1. 基本信息^toc 文章目录 1. 基本信息^toc2. 信息收集3. 图片解密3.1. 爆破用户名3.2. 绕过rbash3.3. 提权检测 4. 获取webshell4.1. 修改php配置 5. www-data提权gabriel6. gabriel提取到Peter7. Peter提权root 靶机链接 https://ha…

PaddleOCR训练自己的私有数据集(包括标注、制作数据集、训练及应用)

目录 一、制作数据集 1、进入到PaddleOCR-releas-2.7目录 2、首先启用PPOCRLabel&#xff1a;在终端激活环境 3、接着点击左下角的自动标注 4、确认完成后点击左上角 5、新建gen_ocr_train_val_test.py 二、训练文字检测模型 1、模型下载 2.、配置ppocr检测模型文件 …

网络层协议--ip协议

目录 引言 IP协议 协议头格式 16位标识与3位标志与13位片偏移讲解 网段划分(重要) DHCP技术 CIDR技术 特殊的IP地址 广播主机 IP地址的数量限制 私有IP地址和公网IP地址 路由&#xff1a;在复杂的网络结构中, 找出一条通往终点的路线 简单认识路由器 路由表生成算…

区块链期末复习3.2:比特币脚本

目录 一、输入输出脚本的执行 二、简单脚本实例及压栈过程 1.P2PK&#xff08;pay to public key hash&#xff09; 2、P2PH&#xff08;pay to public key hash&#xff09; 3.多重签名 4.比特币脚本的应用&#xff1a; 三、其他常见指令 1.OP_EQUAL与OP&#xff3f;EQ…

【Mac】终端改色-让用户名和主机名有颜色

效果图 配置zsh 1.打开终端&#xff0c;进入.zshrc配置 cd ~ vim .zshrc2.添加如下配置并保存 # 启用命令行颜色显示 export CLICOLOR1 ## 加载颜色支持 autoload -U colors && colors # 配置 zsh 提示符 PROMPT"%{$fg_bold[red]%}%n%{$reset_color%}%{$fg_bol…

CUDA各种内存和使用方法

文章目录 1、全局内存2、局部内存3、共享内存3.1 静态共享内存3.2 动态共享内存 4、纹理内存5、常量内存6、寄存器内存7、用CUDA运行时API函数查询设备CUDA 错误检测 1、全局内存 特点&#xff1a;容量最大&#xff0c;访问延时最大&#xff0c;所有线程都可以访问。 线性内存…

青少年科普教学系统平台的设计与实现springboot

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校教师成果信息管理混乱&#xff0c;出错率高&#xff0c;信息安…

Vue2:v-for创建echart图表时不能使用动态ref,要使用动态id

项目中需要创建一组图表+表格的组合,一共15组,为了便于维护,希望使用v-for来创建,而不是写出15组<div>,但是动态指定echart的ref时,频繁遭遇init失败,提示“TypeError: this.dom.getContext is not a function”。过程记录如下。 实现效果 要实现的效果如下图,…

Ch9 形态学图像处理

Ch9 形态学图像处理 blog点此处&#xff01;<--------- 四大算子相应性质。 腐蚀、膨胀、开闭之间的含义、关系 文章目录 Ch9 形态学图像处理预备知识(Preliminaries)膨胀和腐蚀(Dilation and Erosion)腐蚀膨胀膨胀与腐蚀的对偶关系 开闭操作(Opening and Closing)开运算闭…

likeAdmin架构部署(踩坑后的部署流程

1、gitee下载 https://gitee.com/likeadmin/likeadmin_java.git 自己克隆 2、项目注意 Maven&#xff1a;>3.8 ❤️.9 (最好不要3.9已经试过失败 node &#xff1a;node14 (不能是18 已经测试过包打不上去使用14的换源即可 JDK&#xff1a;JDK8 node 需要换源 npm c…

如何解决 ‘adb‘ 不是内部或外部命令,也不是可运行的程序或批处理文件的问题

在cmd中输入 adb &#xff0c;显示 ‘adc‘ 不是内部或外部命令&#xff0c;也不是可运行的程序或批处理文件的问题 解决办法&#xff1a;在环境变量中添加adb所在的路径 1、找到 adb.exe 的所在的文件路径&#xff0c;一般在 Android 安装目录下 \sdk\platform-tools\adb.exe…

使用 OpenCV 在图像中添加文字

在图像处理任务中&#xff0c;我们经常需要将文本添加到图像中。OpenCV 提供了 cv2.putText() 函数&#xff0c;可以很方便地在图像上绘制文本&#xff0c;支持多种字体、颜色、大小和位置等参数。 本文将详细介绍如何使用 OpenCV 在图像中添加文字&#xff0c;介绍 cv2.putTe…