题目地址(3. 无重复字符的最长子串)
https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
题目描述
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
哈希表法
从前向后遍历字符串,用一个哈希表记录不重复字符的位置,如果碰到一个字符已经在哈希表中,就删除重复字符之前的所有字符,每次哈希表中添加新字符,都更新最长不重复的长度
- 语言支持:Python3
Python3 Code:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#双指针前进
strLength={}
max_len=0
for i in range(len(s)):
if s[i] not in strLength:
strLength[s[i]]=i
max_len=max(max_len,len(strLength))
else:
#如果字符串在字典里面了,将这个字典里该字符之前的所有字符删除
index1=strLength[s[i]]
listKeys=list(strLength.keys())
for k1 in listKeys:
if strLength[k1]<=index1:
del strLength[k1]
else:
break;
strLength[s[i]]=i
return max_len
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ∗ m a x ( s t r l e n g t h ) O(n*max(str_length) O(n∗max(strlength)
- 空间复杂度: O ( m a x ( s t r l e n g t h ) O(max(str_length) O(max(strlength)
双指针法
关键点
双指针法,其实这方法很好理解,就是一个左指针不断地一个个向前走,每次走动一格,另一个右指针,则负责开拓,这里最关键的是定义好开拓结束条件,也就是出现重复字符,就停止开拓,更新不重复字符长度。然后左指针加一,并从不重复字符中移除最左侧字符。重复上述操作,直至左指针到达最后一个字符就停止
代码
- 语言支持:Python3
Python3 Code:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
#这个题中左指针更多的时候是一个不断前进的固定靶子,每次前进一格,而右指针是一个宽松的向前探索的活动靶子
strSet=set()
rightEdge=len(s)
max_len=0
rk=-1
for i in range(len(s)):
#左指针前进
if i!=0:
strSet.remove(s[i-1])
while rk+1<len(s) and s[rk+1] not in strSet:#右指针探索
strSet.add(s[rk+1])
rk+=1
max_len=max(max_len,rk-i+1)
return max_len
复杂度分析
令 n 为数组长度。
- 时间复杂度: O ( n ∗ m a x ( s t r l e n g t h ) ) O(n*max(str_length)) O(n∗max(strlength))
- 空间复杂度: O ( n ∗ m a x ( s t r l e n g t h ) ) O(n*max(str_length)) O(n∗max(strlength))