一、题目理解
-
题目描述
- 题目给定一个字符串
s,需要找出这个字符串中最长的回文子串的长度。 - 回文子串是指从左到右和从右到左字符顺序相同的字符串。
- 题目给定一个字符串
-
测试样例分析
-
样例 1:
- 输入:
s = "abcbd" - 输出:
5 - 解释:最长回文子串是
"abcba",长度为 5。
- 输入:
-
样例 2:
- 输入:
s = "ababacab" - 输出:
5 - 解释:最长回文子串是
"ababa",长度为 5。
- 输入:
-
样例 3:
- 输入:
s = "racecarwk" - 输出:
7 - 解释:最长回文子串是
"racecar",长度为 7。
- 输入:
-
二、代码分析
-
函数定义
- 代码中定义了一个函数
solution(s),这个函数用于计算给定字符串s中最长回文子串的长度。
- 代码中定义了一个函数
def solution(s):
n = len(s)
-
首先获取字符串
s的长度n。
-
核心函数
expand_around_center- 定义了一个函数
expand_around_center(left, right),用于从中心向两侧扩展来寻找回文子串。
- 定义了一个函数
def expand_around_center(left, right):
while left >= 0 and right < n and s[left] == s[right]:
left -= 1
right += 1
return right - left - 1
-
这个函数通过两个指针
left和right,从中心向两侧扩展。只要满足以下条件:left不小于 0(保证不越界)。right小于字符串长度n(保证不越界)。s[left]等于s[right](保证字符相同,满足回文条件)。
-
就继续扩展,
left向左移动,right向右移动。当不满足条件时,返回当前找到的回文子串的长度(right - left - 1)。
-
主循环
- 在
solution函数中,通过一个循环来遍历字符串中的每个字符,尝试以每个字符为中心寻找回文子串。
- 在
max_len = 0
for i in range(n):
len1 = expand_around_center(i, i)
len2 = expand_around_center(i, i + 1)
curr_max_len = max(len1, len2)
max_len = max(max_len, curr_max_len)
return max_len
-
首先初始化
max_len为 0,表示目前找到的最长回文子串长度为 0。 -
对于字符串中的每个字符
i:- 调用
expand_around_center(i, i)尝试以单个字符为中心寻找回文子串(适用于奇数长度的回文子串)。 - 调用
expand_around_center(i, i + 1)尝试以相邻两个字符为中心寻找回文子串(适用于偶数长度的回文子串)。 - 取这两种情况中的最大值
curr_max_len。 - 更新全局最大值
max_len。
- 调用
-
最后返回
max_len,即字符串中最长回文子串的长度。
-
测试代码
- 最后一部分代码用于测试
solution函数:
- 最后一部分代码用于测试
if __name__ == '__main__':
print(solution("abcbd") == 5)
print(solution("ababacab") == 5)
print(solution("racecarwk") == 7)
- 这里调用了
solution函数并检查返回结果是否与预期的输出一致。
三、算法复杂度分析
-
时间复杂度
- 对于
expand_around_center函数,每次调用最坏情况下需要遍历字符串的一半长度,时间复杂度为 O(n),其中 n 是字符串的长度。 - 在
solution函数中,对于每个字符都可能调用两次expand_around_center函数,总共调用 次,每次调用时间复杂度为 O(n),所以总的时间复杂度为 O(n^2)。
- 对于
-
空间复杂度
- 除了输入字符串
s占用的空间外,代码中只使用了常数级别的额外空间,所以空间复杂度为 O(1)。
- 除了输入字符串