[leetcode刷题]力扣刷题2之无重复字符的最长子串(中等)

学习到的代码知识

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))  # 输出最长不含重复字符的子串长度

  • 5
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值