首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

《每日一题》-最长回文子串

题目描述 T5

给定一个字符串s,找到s中最长的回文子串。示例1:

示例2:

题目解析

回文串有两种形式,因此需要考虑两种情况

长度为奇数,以中间字符对称,比如:"bab"

长度为偶数,两端完全对称,没有中间字符,比如: "bb"

回文串既然是一种对称结构,那么可以从中间往两边进行扩展,扩展的过程中只需要满足两个条件即可继续扩展

小标合法 index>=0 && index

左右扩展的字符要相同 s[left] == s[right]

v1版本程序

根据上述思路,编写代码,代码如下:

提交程序后一次性通过,不幸的是只击败了1%的用户(思路没有错,写出来的程序为啥差距会这么大呢,发现新问题的小伙伴欢迎吐槽)。下面分析一下该程序的时间复杂度和空间复杂度:

时间复杂度

首先需要以任一字符作为中心进行扩展,每个字符扩展考虑两种情况,则执行2n次获取回文串的操作

获取回文串的操作,需要左右扩展,最坏的情况是扩展到字符串的边界,需要扩展n/2次 时间复杂度为 2n*n/2 = n^2

空间复杂度 使用了递归,每次递归最多递归n/2次,因为空间复杂度为O(n)

存在的不足

字符与字符串之间的转换比较多

递归可以改写为非递归

提前使用字符串保存了结果,实际上result与start和end记录了同类的信息,仅仅通过start和end即可获取到result,保留start和end即可

v2版本程序

时间复杂度仍然为o(n^2)由于递归修改为了非递归,因此空间复杂度为o(1)

不变的最后

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190129G0MZFE00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券