学习到的代码知识
1.if s[i] in b 直接找b中有没有是s[i],不需要写一个循环一个一个找了
题目
给定一个字符串 s
,请你找出其中不含有重复字符的 最长子串的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"
,所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"
,所以其长度为 1。
示例 3:
输入: s = "pwwkew" 输出: 3 解释: 因为无重复字符的最长子串是"wke"
,所以其长度为 3。 请注意,你的答案必须是 子串 的长度,"pwke"
是一个子序列,不是子串。
思考
题目要求要找出不重复的字符串,还必须是连在一起的。我们可以拿出一个字符,让这个字符与前面的字符从左到右依次比较,有两种情况
1.没有重复的。换下一个字符继续与前面的比较
2.有重复的。记录前面字符串的长度,继续换下一个字符与前面的比较,不过重复字符前的字符就不要比了。
代码实现
为了方便理解,我没有对代码进行封装
s = input()
b = [] # 当前不含重复字符的子串
c = [] # 所有不含重复字符的子串长度
for i in range(len(s)):
if s[i] in b: # 如果当前字符已经在b中,表示遇到了重复字符
c.append(len(b)) # 记录当前b的长度
# 截取重复字符后的子串作为新的b,继续向后检查
b = b[b.index(s[i]) + 1:]
b.append(s[i]) # 将当前字符添加到b中
# 最后检查一次,避免遗漏
c.append(len(b))
print(max(c)) # 输出最长不含重复字符的子串长度