题目:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
思路
我们可以使用双指针来解决这个问题。具体地,我们维护两个指针 left 和 right,表示当前子串的左右边界。在每次迭代中,我们将 right 向右移动一位,并检查新的字符是否已经出现过。如果该字符没有出现过,则继续扩大当前子串;否则,我们需要缩小子串,直到其中不再包含重复的字符为止。
为了判断一个字符是否出现过,我们可以使用哈希表。具体地,在遍历字符串 s 的过程中,对于每个字符,我们将其插入哈希表中,并记录其最近一次出现的位置。如果当前字符已经在哈希表中出现过了,并且它的上一次出现位置在左边界 left 的右侧,那么我们就需要更新左边界到当前字符的上一次出现位置的右侧。这是因为在该位置之前的所有字符都已经不可能出现在当前子串中了。
class Solution(object):
def lengthOfLongestSubstring(self, s):
"""
:type s: str
:rtype: int
"""
hashmap = {}
left = 0
max_len = 0
for right in range(len(s)):
if s[right] in hashmap and hashmap[s[right]] >= left:
left = hashmap[s[right]] + 1
hashmap[s[right]] = right
max_len = max(max_len, right - left + 1)
return max_len
在上面的代码中,我们首先创建一个空的哈希表 hashmap,并初始化左边界 left 和最大子串长度 max_len。随后,我们依次遍历字符串 s 中的每个字符,对于每个字符,我们查询其是否已经在哈希表中出现过,并且其上一次出现位置是否在左边界 left 的右侧。如果满足这两个条件,则需要更新左边界 left;否则,我们将当前字符插入哈希表中,并更新最大子串长度 max_len。最后,我们返回最大子串长度即可。
由于我们只需要遍历一遍字符串 s,因此总时间复杂度为 O(n),其中 n 是字符串 s 的长度。另外,由于哈希表的大小最多为字符集的大小(即 O(1)),因此空间复杂度也为 O(1)