与LeetCode第三题——最长不重复子串一样,给定 “abcabcbb” ,没有重复字符的最长子串是 “abc” ,那么长度就是3。当时让我返回长度和子串。当时用的动态规划,da[i]表示到i最长的不重复子串长度。下面介绍双指针法,从指针 i 到 j−1之间的子字符串s[i:j] 是没有重复的子串,如果s[j]不在子串里,j=j+1,否则子串中移除s[i],i=i+1,这里可以进行优化,应该移除重复的元素,i大步前进,可以使用字典同时存储索引信息。
def lengthOfLongestSubstring(self, s):
charSet=set()
n=len(s)
if n<=1:
return n
maxLen=1
i=0
j=0
num = 0
while(i<n and j<n):
# 如果集合中不存在当前字符
if s[j] not in charSet:
charSet.add(s[j])
j+=1
maxLen = max(j - i, maxLen)
if maxLen == j - i:
num = i
else:
charSet.remove(s[i])
i+=1
return num, maxLen