数据结构与算法-回文字符串

数组

给你一个字符串 s,找到 s 中最长的回文子串。
如果字符串的反序与原始字符串相同,则该字符串称为回文字符串。
示例 1:
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
示例 2:
输入:s = “cbbd”
输出:“bb”

1.第一次实现

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        max_length = 2
        max_str = None
        for stride in range(2,len(s)+1):
            flag = 0
            while not flag:
                for i in range(len(s)):
                    temp_str = s[i:i+stride]
                    if len(temp_str)%2 and i+stride <= len(s):
                        # 判断单数单元
                        step = 0
                        for j in range(0,len(temp_str)//2):
                            if temp_str[j] == temp_str[len(temp_str)-1-j]:
                                # 如果发现窗口单元不是回文字符串,则函数继续执行
                                step+=1
                        if step*2 ==len(temp_str)-1:
                            flag = 1
                            if stride > max_length:
                                max_length = stride
                                max_str = temp_str
                        else:
                            flag = 0
                    else:
                        # 判断双数单元
                        step = 0
                        win_length = len(temp_str)
                        for j in range(0,win_length//2):
                            if temp_str[j] == temp_str[win_length-j-1] :
                                # 如果发现窗口单元不是回文字符串,则函数继续执行
                                step+=1
                        if step*2 ==len(temp_str):
                            flag = 1
                            if stride >= max_length:
                                max_length = stride
                                max_str = temp_str
                        else:
                            flag = 0
        return max_str    

2.参考代码

  • 首先设置初始的回文字符串’’
  • 设定起始的滑动窗口,根据res的大小控制其实质,根据i来控制遍历的窗口大小
  • 当窗口字符串为奇数时,判定其字符串与倒序字符串是否相同,若相同更新回文字符串大小与start起始位置
  • 这里使用了temp[::-1]数组倒序
  • temp = temp[1:],回文字符串自身规律
class Solution(object):
    def longestPalindrome(self, s):
        res = ''
        for i in range(len(s)):
            start = max(i - len(res) -1, 0)
            temp = s[start: i+1]
            if temp == temp[::-1]:
                res = temp
            else:
                temp = temp[1:]
                if temp == temp[::-1]:
                    res = temp
        return res

作者:雨晨GG
链接:https://leetcode.cn/problems/longest-palindromic-substring/solutions/1601761/by-yu-chen-gg-kz5y/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

3.原有代码修改

class Solution(object):
    def longestPalindrome(self, s):
        """
        :type s: str
        :rtype: str
        """
        # 极端案例'ab',这个字符串的回文字符串为'a'
        if len(s)==2 and s!=s[::-1]:
            return s[0]
        ### 以下处理通用案例,将回文字符串划分为两种情况
        ### 回文字符串为单数与回文字符串为偶数
        #初始化回文字符串
        max_length = 1
        max_str = ""
        # 外层循环控制滑动窗口步长
        for stride in range(1, len(s) + 1):
            # 内层循环控制窗口移动范围范围:注意窗口移动范围不能越界
            for i in range(len(s) - stride + 1):
                # 提取窗口字符串
                temp_str = s[i:i+stride]
                #分不同情况进行判定,若发现回文字符串,则跳出内部循环,更新步长与回文字符串,直至遍历所有长度类型的回文字符串。
                if stride % 2 :
                    # 判断单数单元
                    if temp_str == temp_str[::-1]:

                        # 发现回文字符串
                        if stride >= max_length:
                            max_length = stride
                            max_str = temp_str
                            break
                else:
                    # 判断双数单元
                    if temp_str == temp_str[::-1]:
                        flag = 1
                        if stride >= max_length:
                            max_length = stride
                            max_str = temp_str
                            # 跳出内层循环 
                            break  
        return max_str

在测试算法过程中,1)列表转置操作可以有效提高计算效率;2)如果不设置字符创移动边界,会增加算法的计算量,字符串越界回返回错误结果),3)我将return写到内层循环中,每次跳出时,直接返回了函数结果;平常习惯直接调用api,需要多熟悉一些数组的基本操作。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Day01——NestJS学习之了解、安装、运行

什么是 Nest.js&#xff1f; NestJs 官方简介: Nest (NestJS) 是一个用于构建高效、可扩展的 Node.js 服务器端应用程序的开发框架。它利用 JavaScript 的渐进增强的能力&#xff0c;使用并完全支持 TypeScript &#xff08;仍然允许开发者使用纯 JavaScript 进行开发&#x…

数据仓库作业五:第8章 关联规则挖掘

目录 第8章 关联规则挖掘作业题 第8章 关联规则挖掘 作业题 1、设4-项集 X { a , b , c , d } X\{a,b,c,d\} X{a,b,c,d}&#xff0c;试求出由 X X X 导出的所有关联规则。 解&#xff1a; 首先生成项集的所有非空真子集。这包括&#xff1a; { a } , { b } , { c } , {…

ansible执行mysql脚本

目录 概述实践环境要求ansible yml脚本命令离线包 概述 ansible执行mysql脚本 实践 官网文档 环境要求 环境需要安装以下内容: 1.mysql客户端(安装了mysql即会有)2.安装MySQL-python (Python 2.X) 详细插件安装链接 ansible yml脚本 关键代码如下&#xff1a; # 剧本…

ROS2学习笔记(一) 基本概念

1. Node 节点 节点: 完成具体功能的模块 相关命令 #运行命令 ros2 run <package_name> <executable_name>#当前节点查询查询 ros2 node list#重映射 Remapping ros2 run <package_name> <executable_name> --ros-args --remap __node:<node_na…

KaiwuDB CTO 魏可伟:AIoT,用行业定义数据库

4月12日&#xff0c;由中国 DBA 联盟&#xff08;ACDU&#xff09;与墨天轮社区联合主办的第十三届数据技术嘉年华&#xff08;DTC 2024&#xff09;于北京盛大召开。KaiwuDB CTO 魏可伟受邀发表《智创当下&#xff0c;KaiwuDB 从多模到 AI 的探索实践》主题演讲&#xff0c;向…

Axure如何实现限制选择项数量的交互

大家经常会看到这样的功能设计&#xff1a;可以多选&#xff0c;但是限制多选。比如某招聘网站城市的选择只能选择5个。再选择第6个的时候会提示最多只能选择5项。 这个效果是我们经常会遇到的&#xff0c;在工作中也经常会遇到需要制作这样的效果。今天我们一起来看看&#xf…

Mac M3 安装Ollama和llama3,本地部署LobeChat和刘皇叔聊三国!

OllamaLobeChat&#xff0c;本地部署聊天助手 Ollama安装下载OllamaOllama常用指令和链接运行OllamaAPI 交互Ollama基于Llama 3角色扮演 LobeChat安装首先安装docker安装LobeChat的docker 镜像和运行 Ollama安装 下载Ollama 网址&#xff1a;https://ollama.com/ 支持macOS、…

产废端实时音视频监控系统在运输车辆驾驶室中的应用

实时音视频监控系统可通过在运输车辆驾驶室安装音视频摄录设备&#xff0c;实现将运输车辆内部及周围环境音视频数据通过移动网络实时回传指挥中心的功能。 前端摄录设备主要负责采集车内外的视音频信息&#xff0c;为了保障车辆及运输人员 的安全&#xff0c;应合理选择摄录设…

LeetCode 349.两个数组的交集(HashSet的使用)

给定两个数组 nums1 和 nums2 &#xff0c;返回 它们的 交集 。输出结果中的每个元素一定是 唯一 的。我们可以 不考虑输出结果的顺序 。 示例 1&#xff1a; 输入&#xff1a;nums1 [1,2,2,1], nums2 [2,2] 输出&#xff1a;[2]示例 2&#xff1a; 输入&#xff1a;nums1 …

电商技术揭秘三十:知识产权保护浅析

电商技术揭秘相关系列文章&#xff08;上&#xff09; 相关系列文章&#xff08;中&#xff09; 电商技术揭秘二十&#xff1a;能化供应链管理 电商技术揭秘二十一:智能仓储与物流优化(上) 电商技术揭秘二十二:智能仓储与物流优化(下) 电商技术揭秘二十三&#xff1a;智能…

学习大数据的第一天

今天学习如何安装hapood安装 1.安装hapood安装 2.需要的资料 3.开始安装 1.创建目录 mkdir -p /export/server 2.进入目录下 cd /export/server/ 3.安装 安装需要的依赖 yum install gcc gcc-c make autoconf automake libtool curl lzo-devel zlib-devel openssl opens…

安装SSL证书之后还会有不安全提示怎么办?

安装SSL证书过程中如果遇到错误&#xff0c;不要慌&#xff0c;按照以下步骤进行排查和解决&#xff1a; 1. 仔细阅读错误信息&#xff1a; - 错误消息通常会明确指出问题所在&#xff0c;如证书过期、证书链不完整、域名不匹配等。记下或截图保存具体的错误代码和描述&#xf…

解锁ApplicationContext vs BeanFactory: 谁更具选择性?

目录 一、聚焦源码回顾 &#xff08;一&#xff09;源码分析和理解 &#xff08;二&#xff09;简短的回顾对比建议 二、ApplicationContext vs BeanFactory特性对比 &#xff08;一&#xff09;主要特性总结 &#xff08;二&#xff09;直接建议 三、案例简单说明 &am…

SCADA系统通过巨控GRM模块实现OPC协议远程监控PLC

SCADA系统和PLC不在同一个地方&#xff0c;需要远程监控和控制PLC&#xff0c;可以通过巨控GRM模块来实现&#xff0c;通过OPC协议转巨控服务器远程读写PLC寄存器&#xff0c;从而完成远程监控PLC。 要实现SCAKDA系统远程监控PLC&#xff0c;关键是要实现SKADA能通过互联网访问…

G1垃圾回收器

G1垃圾回收器 概述 1.Young Collection(年轻代垃圾回收) 说明&#xff1a;下图中 e代表eden区(伊甸园)&#xff0c;s代表幸存者区&#xff0c;o代表老年代 初始时&#xff0c;所有区域都处于空闲状态 创建了一些对象&#xff0c;挑出一些空闲区域作为伊甸园区存储这些对象 G1…

数据结构学习--环形链表

环形链表 我们在判断一个链表是否是环形的&#xff0c;即首尾相连&#xff0c;我们可以以使用快慢指针&#xff0c;如果快指针能再次追上慢指针&#xff0c;就说明该链表是环形的&#xff0c;这边可以举个操场跑步的例子&#xff0c;当操场是环形的&#xff0c;跑的快的&#…

Docker Compose 的安装和使用详解

Docker Compose 是 Docker 官方开源的容器编排(Orchestration)项目之一,用于快速部署分布式应用。本文将介绍 Docker Compose 的基本概念、安装流程及使用方法。 简介 Compose 项目是 Docker 官方的开源项目,负责实现对 Docker 容器集群的快速编排。从功能上看,Docker C…

交换基础配置--单臂路由

1、创建vlan 创建vlan10 创建vlan10和vlan20 创建vlan1到vlan9 vlan1可以不用创建&#xff0c;因为交换机的所有接口默认为vlan1 本实验只需要vlan10和vlan20&#xff0c;以上只是介绍创建vlan的方法。 查看创建的vlan&#xff1a; sw2同理。接着将需要划分vlan的接口划入…

【java】29:IO流

文件&#xff1a; 1 什么是文件&#xff1a; 文件&#xff0c;对我们并不陌生&#xff0c;文件是保存数据的地方&#xff0c;比如大家经常使用的word文档,txt文件&#xff0c;excel文件.….都是文件。它既可以保存一张图片&#xff0c;也可以保持视频&#xff0c;声音.. .2 文…

开源Windows12网页版HTML源码

源码介绍 开源Windows12网页版HTML源码&#xff0c;无需安装就能用的Win12网页版来了Windows12概念版&#xff08;PoweredbyPowerPoint&#xff09;后深受启发&#xff0c;于是通过使用HTML、CSS、js等技术做了这样一个模拟板的Windows12系统&#xff0c;并已发布至github进行…
最新文章