python
双指针:
- 使用两个指针表示字符串中的某个子串的左右边界。其中左指针代表着某个子串的起始位置,而右指针代表着某个字串的终止位置;
- 在每一步的操作中,将左指针向右移动一格,表示开始枚举下一个字符作为起始位置,然后不断地向右移动右指针,但需要保证这两个指针对应的子串中没有重复的字符。在移动结束后,这个子串就对应着以左指针开始的,不包含重复字符的最长子串。最后记录下这个子串的长度即为答案;
class Solution:
def lengthOfLongestSubstring(self, s):
n = len(s)
rk, ans = -1, 0 # rk为右指针位置,从左边第一个字符的左侧开始,ans记录无重复字符串的长度
occ = set() # 集合用来去重
for i in range(n): # i是左指针位置
if i != 0:
occ.remove(s[i-1])
''' 避免因为前面的某个字符而导致后面的字符串断开,比如abcad,
如果第一个a不被remove,就会错过最长无重复字符串bcad '''
while rk+1 < n and s[rk+1] not in occ:
# while循环后occ里的字符组成的字符串即为某个无重复字符串
occ.add(s[rk+1])
rk += 1
ans = max(ans, rk-i+1)
return ans
复杂度分析:
- 时间复杂度:O(N),其中 NN 是字符串的长度。左指针和右指针分别会遍历整个字符串一次。
- 空间复杂度:O(∣Σ∣),其中 Σ 表示字符集(即字符串中可以出现的字符),∣Σ∣ 表示字符集的大小。