1.需求
#给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
#输入: s = “pwwkew”
#输出: 3
#解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
#请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。
2.代码
class Solution:
def length_substring(self, str):
# 如果字符串为空,直接返回0
if not str:
return 0
# 定义一个变量,用来指向字符串最左边的元素,用于删除
left = 0
# 定义一个集合,用于存储子字符串(集合中不允许有重复值)
str_child = set()
# 获取当前字符串长度
n = len(str)
# 定义子串的最大长度
max_len = 0
# 定义当前遍历长度
cur_len = 0
for i in range(n):
cur_len += 1
# 如果当前字符在子串集合中,移除当前子串的最左边的元素
# 同时将指向最左边的变量+1,将当前长度变量-1
while str[i] in str_child:
str_child.remove(str[left])
left += 1
cur_len -= 1
# 如果当前长度大于子串的最大长度,将最大长度=当前长度
if cur_len > max_len:
max_len = cur_len
# 将遍历到的字符加入到子串集合中
str_child.add(str[i])
return max_len
if __name__ == '__main__':
res=Solution()
str='pwwkew'
index=res.length_substring(str)
print(index)
3.分析
# 解析:
# 1. cur_len=1 -> p不在set()中 -> max_len=1 -> set(p)
# 2. cur_len=2 -> w不在set(p)中 -> max_len=2 -> set(pw)
# 3. cur_len=3 -> w在set(pw)中 -> set(w) -> left=1 -> cur_len=2
# 4. cur_len=2 -> k不在set(w)中 -> set(wk)
# 5. cur_len=3 -> e不在set(wk)中 -> max_len=3 -> set(wke)
# 6. cur_len=4 -> w在set(wke)中 -> set(ke) -> left=1 -> cur_len=3
# 7.循环结束 max_len=3