算法刷题-python版-最大回文子串

news2024/9/21 16:25:00

文章目录

  • 回文字符串
  • 如何判断是回文字符串
  • 求解字符串的最大回文子串
    • 暴力求解
    • 中心扩展(比较优的方式)
    • 两种方式性能对比

回文字符串

正读、反读都是同一个字符串本身,这样的字符串就是回文字符串。
如 abccba 是回文字符串;
而 abcd 却不是回文字符串
 

如何判断是回文字符串

字符串的
第一个位置与最后一个位置字符相同;
第二个位置与倒数第二个位置字符相同;
依次类推…
满足这样的要求的就是回文字符串。

代码实现,判断是否为回文字符串

# __author__ = "laufing"


def is_palindrome(target_s: str) -> bool:
    """ 是否回文字符串  两边对称 """
    if len(target_s) < 2:
        return True
    n = len(target_s)
    for i in range(n//2):
    	# 取第一个字符 与 最后一个字符比较
        if target_s[i] == target_s[n - i - 1]:
            continue
        else:
            return False
    else:
        return True


if __name__ == '__main__':
    s = "abccba"
    print(is_palindrome(s))

 

求解字符串的最大回文子串

给定一个字符串,求解其最大的回文子串。

例子1:
输入: “babad”
输出: “bab”
注意: “aba” 也是一个有效答案。

例子2:
输入: “abaelele”
输出: “elele”

暴力求解

暴力求解思路
列出目标字符串的所有的子串,根据长度从大到小,依次循环判断每个子串是否为回文字符串,找到则停止。
在这里插入图片描述

# 暴力求解
def find_max_palindrome(target_s: str) -> str:
    if len(target_s) < 2:
        return target_s
    result = ""
    n = len(target_s)
    for i in range(n, 0, -1):
        for j in range(n + 1 - i):
            sub_str = target_s[j:j+i]
            if is_palindrome(sub_str):
                result = sub_str
                return result
    # 时间复杂度O(n^3)  空间复杂度O(1)

 

中心扩展(比较优的方式)

思路
从左到右依次遍历字符串的每个字符,每个字符向两边扩展,只要最内部不是回文,则后续的扩展也不可能是回文;继续遍历下一个字符。


# 中心扩展法
def center_expand(target_s: str) -> str:
    if len(target_s) < 2:
        return target_s
    n = len(target_s)
    result = ""
    for i in range(n):
        # 奇数回文
        temp1 = do_expand(target_s, i, i)
        # 偶数回文
        temp2 = do_expand(target_s, i, i + 1)

        if len(temp1) > len(result):
            result = temp1
        if len(temp2) > len(result):
            result = temp2
    return result


# 核心部分 
def do_expand(target_s, left, right):
    """ 两边扩展: left 左边索引; right右边索引 """
    while left >= 0 and right < len(target_s) and target_s[left] == target_s[right]:
        left -= 1
        right += 1

    return target_s[left + 1 : right]

两种方式性能对比

# timeit测试性能
from timeit import Timer
# s = "abadcaacdele"
s = "abaelele"
timer1 = Timer("find_max_palindrome(s)", globals=globals()) # 测试是在另一个位置,
# 所以查找函数及参数需要指定globals()
timer2 = Timer("center_expand(s)", "from __main__ import center_expand, s") # 也可导入
t1 = timer1.repeat(5, 10000) # 重复测试5次(timeit),每次执行1000次的时间
t2 = timer2.repeat(5, 10000)
print("暴力求解性能:", t1)
print("中心扩展性能:", t2)

在这里插入图片描述
此时暴力求解的性能还略优于中心扩展法,这个是与最大回文子串的长度有关系的,当最大回文子串的长度与目标字符串的总长度相差大的时候,暴力求解就的劣势就会显示出来。
如求解 s = "ipqabadcaacdeleffggklmen"这个字符串的最大回文子串,性能对比如下:
在这里插入图片描述
此时,暴力求解占用时间明显增多,中心扩展法性能高出很多。
总结:中心扩展法是比较优的解法。

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

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

相关文章

产品EMC传导发射超标问题分析与整改

某产品在入网测试电磁骚扰项目中&#xff0c;直流电源端口&#xff08;DC端口&#xff09;传导发射测试超标严重&#xff0c;在低频150kHz~2MHz之间&#xff0c;某些频点超标10dBuV以上。经过对电源单板现场整改&#xff0c;再次测试DC端口传导发射顺利通过&#xff0c;余量在5…

准备好了吗?加入 GDE 成长计划,成为下一位谷歌开发者专家!

谷歌开发者专家 (Google Developer Experts&#xff0c;GDE)&#xff0c;又称谷歌开发者专家项目&#xff0c;是由一群经验丰富的技术专家、具有社交影响力的开发者和思想领袖组成的全球性社区。通过在各项活动演讲以及各个平台上发布优质内容来积极助力开发者、企业和技术社区…

C#基础篇

枚举enum 枚举的使用 using System.Net.Http.Headers; using System.Runtime.InteropServices; using System.Security.Cryptography;namespace game_code {enum E_MonsterType{Normal,// 普通怪Boos// Boos怪}internal class Program{static void Main(string[] args){// 枚…

Linux信号量详解

一、什么是信号量信号量的本质是一种数据操作锁、用来负责数据操作过程中的互斥、同步等功能。信号量就和互斥锁类似&#xff0c;本质上就是一个计数器&#xff08;全局变量&#xff09;。不同之处在于&#xff0c;互斥锁的值只有 2 个&#xff08;加锁 "lock" 和解锁…

Mysql Server原理简介

Mysql客户端包括JDBC、 Navicat、sqlyog&#xff0c;只是为了和mysql server建立连接&#xff0c;向mysql server提交sql语句。mysql server组件第一部分叫连接器主要承担的功能叫管理连接和验证权限&#xff0c;每次在进行数据库访问的时候&#xff0c;必然要输入用户名和密码…

421 Maximum login limit has been reached. on hdfs-over-ftp

使用 hdfs-over-ftp 时登录报错421 Maximum login limit has been reached. 本地测试连接第10个用户的时候会报这个异常 就是默认限制了用户登录数量。 DefaultConnectionConfig.java里private int maxLogins 10; 在HdfsOverFtpServer.java里修改了startServer()这个metho…

MSTP基础

MSTP基础引入背景技术概览PVSTP&#xff08;过渡&#xff09;MSTP单生成树的缺陷1&#xff1a;部分VLAN不通单生成树的缺陷2&#xff1a;无法实现流量的负载分担多生成树解决单生成树实例引入背景 RSTP在STP基础上进行了改进&#xff0c;实现了网络拓扑快速收敛。但由于局域网…

【redis学习篇】Redis三种持久化方式详解

官方文档 一、Redis持久性 Redis如何将数据写入磁盘 持久性是指将数据写入持久存储&#xff0c;如固态磁盘&#xff08;SSD&#xff09;。Redis提供了一系列持久性选项。其中包括&#xff1a; RDB&#xff08;快照&#xff09;&#xff1a;RDB持久性以指定的时间间隔执行数据…

程序员的上帝视角(4)——视角

对于开发人员来说&#xff0c;工作都是从评估一个需求开始。我们第一个要解决的问题就是看待需求的视角。视角的不同&#xff0c;得到的设计方案可能是完全不同的。作为一个程序员&#xff0c;不能单单从个人视角来看待问题。而是要尝试从不同角色出发&#xff0c;不停思考。上…

C++——内存管理

一&#xff0c;为什么要有内存管理因为在C/C中各个内置类型或者是自定义类型的大小都不一样&#xff0c;而如何让各个类型在内存中合理分布就非常有必要&#xff0c;由此我们就需要有内存管理。我们来看看下面这个程序中的各个变量都是如何分布的int globalVar 1; static int …

100种思维模型之混沌与秩序思维模型-027

人类崇尚秩序与连续性&#xff0c;我们习惯于我们的日常世界&#xff0c;它以线性方式运作&#xff0c;没有不连续或突跳。 为此&#xff0c;我们学会了期望各种过程以连续方式运行&#xff0c;我们的内心为了让我们更有安全感&#xff0c;把很多事物的结果归于秩序&#xff0c…

链表的中间结点与链表的倒数第k个结点(精美图示详解哦)

全文目录引言链表的中间结点题目描述与思路实现链表的倒数第k个结点题目描述与思路实现总结引言 在上一篇文章中&#xff0c;介绍了反转链表 我们利用了链表是逻辑连续的特点&#xff0c;逆置了链表的逻辑连接顺序&#xff0c;从而实现反转链表&#xff1a; 戳我查看反转链表详…

【编程基础之Python】11、Python中的表达式

【编程基础之Python】11、Python中的表达式Python中的表达式表达式与运算符算术表达式赋值表达式比较表达式逻辑表达式位运算表达式总结Python中的表达式 在Python中&#xff0c;表达式是由操作数、运算符和函数调用等组成的语法结构&#xff0c;可以进行各种数学运算、逻辑判…

Maven环境下构建多模块项目

使用maven提供的多模块构建的特征完成maven环境下多模块的项目的管理和构建 这里以四个模块为例来搭建项目&#xff0c;以达到通俗易懂的初衷 模块 maven_parent -- 基模块&#xff0c;也就是常说的parent (pom) 模块 maven_dao -- 数据库访问层&#xff0c;例如jdbc操作(jar) …

华为OD机试题,用 Java 解【查找重复代码】问题

华为Od必看系列 华为OD机试 全流程解析+经验分享,题型分享,防作弊指南)华为od机试,独家整理 已参加机试人员的实战技巧华为od 2023 | 什么是华为od,od 薪资待遇,od机试题清单华为OD机试真题大全,用 Python 解华为机试题 | 机试宝典使用说明 参加华为od机试,一定要注意不…

深度学习技巧应用3-神经网络中的超参数搜索

大家好&#xff0c;我是微学AI&#xff0c;今天给大家带来深度学习技巧应用3-神经网络中的超参数搜索。 在深度学习任务中&#xff0c;一个算法模型的性能往往受到很多超参数的影响。超参数是指在模型训练之前需要我们手动设定的参数&#xff0c;例如&#xff1a;学习率、正则…

计算机科学导论笔记(三)

五、计算机组成 计算机组成部件可以分为三大类&#xff08;子系统&#xff09;&#xff1a;中央处理单元&#xff08;CPU&#xff09;、主存储器和输入/输出子系统。 5.1 中央处理单元&#xff08;CPU&#xff09; 中央处理单元用于数据的运算&#xff0c;分为算术逻辑单元&a…

谁是世界上最好的编程语言?--编程语言70年浅谈

1、编程语言发展史纵览 严谨起见&#xff0c;本文提到的编程语言指的是「第三代高级编程语言」。 首先&#xff0c;我们从时间维度入手聊聊编程语言。一图胜千言&#xff0c;我们从目前主流的编程语言中&#xff0c;挑选出流行的、具有历史影响力的语言。把它们按时间从上往下…

【Java笔记】泛型

本章专题与脉络 泛型概述 生活中的例子 举例1&#xff1a;中药店&#xff0c;每个抽屉外面贴着标签 举例2&#xff1a;超市购物架上很多瓶子&#xff0c;每个瓶子装的是什么&#xff0c;有标签 举例3&#xff1a;家庭厨房中&#xff1a; Java中的泛型&#xff0c;就类似于上…

Spark 平衡 CPU

Spark 平衡 CPUCPU/内存平衡CPU 低效线程挂起调度开销优化 CPUCPU/内存平衡 Spark 将内存分 : Execution Memory : 用于分布式任务执行Storage Memory : 用于 RDD 缓存RDD 缓存展开前消耗 Execution Memory , 最后占用 Storage Memory 线程/执行内存关系&#xff1a; 执行内…