这是一个比较经典的算法题,给定一个字符串 s ,请你找出其中不含有重复字符的最长子串的长度。只需要返回最大长度即可
例子:
示例 1:输入: s = "abcabcbb" 输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb" 输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
解法一:
明确记录两个信息,一个无重复字符的内容max_string,一个是无重复字符的长度max_length,
首先对字符串进行遍历,如果遍历的字符元素不在 max_string 中,表示未出现重复字符串,对max_string进行追加元素
如果在 max_string 中,则对 max_string 进行分割,分割点是当前遍历的字符元素,
然后将分割后的字符串进行追加,然后更新 max_length,
max_length 的最终的值是从分割后的字符串长度和当前 max_length 的值中取最大值
代码如下:
def get_max_single_length(s):
max_length = 0
max_string = ""
for i in s:
if i not in max_string:
max_string += i
else:
max_length = max(max_length, len(max_string))
max_string = max_string.split(i)[1] + i
return max(max_length, len(max_string))
解法二:
使用滑动窗口来解决这个问题。
定义一个哈希集合,用于存储当前窗口中的字符,以及两个指针 left 和 right 表示滑动窗口的左右边界。
初始时,left 和 right 都指向 s 的开头。然后,right 向右移动,每次移动时,将当前字符加入哈希集合中。
如果发现当前字符已经在哈希集合中,表示出现了重复字符,此时更新 max_length 为当前窗口长度(right - left)并将 left 移动到重复字符的下一个位置,直到窗口中不再有重复字符为止。
重复以上步骤直到 right 到达字符串 s 的末尾。最终得到的 max_length 即为所求的最长子串长度。
这种方法的时间复杂度为 O(n),其中 n 是字符串的长度。
代码如下:
def length_of_longest_substring(s: str) -> int:
# 用于存储当前窗口中的字符
char_set = set()
# 左右指针和最长子串长度
left = 0
max_length = 0
# 右指针向右移动
for right in range(len(s)):
# 如果当前字符已经在哈希集合中,表示出现了重复字符
while s[right] in char_set:
# 移除左指针对应的字符,并将左指针右移一位
char_set.remove(s[left])
left += 1
# 将当前字符加入哈希集合中
char_set.add(s[right])
# 更新最长子串长度
max_length = max(max_length, right - left + 1)
return max_length
本文分享自 pythonista的日常 微信公众号,前往查看
如有侵权,请联系 cloudcommunity@tencent.com 删除。
本文参与 腾讯云自媒体同步曝光计划 ,欢迎热爱写作的你一起参与!