文章目录
1:问题描述
来源:LeetCode
难度:中等
问题详情:
给你一个字符串 s
,找到 s
中最长的回文子串。
输入:s = “babad”
输出:“bab”
解释:“aba” 同样是符合题意的答案。
2:问题分析
首先要明确什么叫回文子串。回文子串的定义是一个字符串中正序和反序一样的子串。比如“sabccbad”
中就存在回文子串"abccba"
。
2.1 时间复杂度和空间复杂度
在真正开始介绍各种算法前,先以表格形式展示各自的时间复杂度和空间复杂度, n n n 表示字符串 s s s 的长度。
算法 | 时间复杂度 | 空间复杂度 |
---|---|---|
暴力for循环 | O( n 3 n^3 n3) | O( n n n) |
动态规划 | O( n 2 n^2 n2) | O ( n 2 ) O(n^2) O(n2) |
中心扩展 | O ( n 2 ) O(n^2) O(n2) | O ( 1 ) O(1) O(1) |
2.2 暴力for循环
首先容易想到的就是是双层for循环遍历所有字符子串,然后判断该子串是否为回文子串。
代码较为简单,如下所示:
def longestPalindrome(s: str) -> str:
"""
一个最直接的思路就是双层for循环遍历所有子串可能,然后再对比是否反向和正向是一样的
缺点:面对超长字符串,容易超时
:param s:
:return:
"""
length = len(s)
max_len = 0
result = ''
for i in range(length):
for j in range(i, length + 1):
sub_str = s[i:j]
rever_str = sub_str[::-1]
# 因为这个判断的次数是n次,而两层for循环时间复杂度为O(n²),因此时间复杂度为O(n³)
if sub_str == rever_str:
if len(sub_str) > max_len:
result = sub_str
max_len = len(sub_str)
return result
虽然该思路较为简单易懂,但是时间复杂度也是相当的高,两层for循环的时间复杂度O( n 2 n^2 n2),同时在for循环内部对比是否为回文子串的时间复杂度为O( n n n),因此整个算法的时间复杂度为O( n 3 n^3 n3)。
对于空间复杂度,因为需要存储字符子串,而子串的最大长度与原字符串相等,所以空间复杂度为O( n n n).
2.3 动态规划法
2.3.1 思路
看答案不难想到
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。