本文共 988 字,大约阅读时间需要 3 分钟。
要解决这个问题,我们可以使用一种高效的滑动窗口方法来找到一个不含重复字符的最长子串。这种方法的时间复杂度为O(n),能够在一次遍历中找到答案,无需多次重复计算。
步骤解释:
初始化一个空的字典char_set
来记录字符及其最新出现的位置。
使用两个指针,left
指针表示当前窗口的起始位置,right
指针从字符串的开头开始逐个移动。
对于每个字符char
位于right
位置,检查它是否已经在char_set
中:
char
恰好出现在left
到right
之间: char
位置的下一个位置left = max(left, last_pos[char] + 1)
,以确保窗口内没有重复字符。char
的最新位置为当前right
位置。计算当前窗口的长度,记录最大长度max_len
。
最终,返回max_len
作为不含重复字符的最长子串的长度。
代码示例:
s = input().strip()n = len(s)max_len = 0left = 0char_set = {}for right in range(n): char = s[right] if char in char_set and char_set[char] >= left: left = char_set[char] + 1 char_set[char] = right current_len = right - left + 1 if current_len > max_len: max_len = current_lenprint(max_len)
解释:
char_set
字典:用于记录当前窗口内各字符的最新出现位置。这样可以快速确定一个字符是否在当前窗口内出现过。
left
指针:规定当前有效窗口的起始位置。每当遇到重复字符时,左指针会被调整到避免重复字符出现的位置,确保窗口持续满足不含重复字符的条件。
right
指针:遍历整个字符串,对于每个字符,判断是否已存在于当前窗口内,并更新窗口起始位置和最大长度。
复杂度分析:该方法只需遍历字符串一次,因此时间复杂度为O(n),空间复杂度为O(n),适用于长字符串的处理。
这种方法高效且简洁,能够有效地解决问题,确保在最优时间内得到正确结果。
转载地址:http://qtqez.baihongyu.com/