给定一个字符串,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1: 输入: "abcabcbb" 输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/longest-substring-without-repeating-characters
方法1:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
# 特殊情况判定
if len(s)<=1:
return len(s)
length, start, c_dict = 0, -1, {}
for end, c in enumerate(s):
# 当窗口遇到了重复字符c,且这个子串大于窗口开始位置,更新start
if c in c_dict and start <c_dict[c] :
#
start=c_dict[c]
# 更新这个重复字符的结束下标
c_dict[c]=end
else:
c_dict[c]=end
# 比较并保留最长的子串长度
if length < end-start:
length=end-start
return length
方法2:
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
cur = [] # 暂存不重复字符串
result = 0 # 子串长度
for i in s:
if i in cur:
if len(cur) > result: # 更新子串长度结果
result = len(cur)
# 如果搜索中发现重复子串,置空暂存list
cur[:cur.index(i) + 1] = []
# 存入新的不重复子串
cur.append(i)
#最后判定子串长度,并返回结果
return len(cur) if len(cur) > result else result