无重复字符的最长子串

文章介绍了如何找出字符串中不含有重复字符的最长子串的两种方法:暴力算法和滑动窗口法。滑动窗口法通过使用集合和队列,动态调整窗口大小以避免重复字符,从而在一次遍历中找到最长子串,提高了效率。给出的Python代码示例展示了这种方法的实现。
摘要由CSDN通过智能技术生成

无重复字符的最长子串

题目描述:给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
在这里插入图片描述

  • 方法一:使用暴力算法

可以使用两个for循环,截取字符串的子字符串,然后在对子字符串进行一次判断是否有重复字符串。

  • 方法二:使用滑动窗口

从第一个方法中我们可以进一步的思考,如果我们可以利用数据结构,对当前的遍历的字符串记录是否存在重复的字符串,如果存在动态的改变窗口就可以使用一次遍历完成任务。
具体的实现如下:
首先记录遍历的字符串所有的字符(可以使用一个集合sets保存)
在这里插入图片描述

此时sets=(a,b,d),继续向下遍历
在这里插入图片描述

此时,集合中出现重复选择,我们通过移动i指针,调整窗口大小来筛选最大不重复子字符串。调整原则就是找到与当前字符重复的字符串位置。
在这里插入图片描述

重复上述的步骤就可以找到最大的子字符串。
在这里插入图片描述

代码:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 使用字典序列
        # 使用队列
        que = []
        setal = set()
        maxnum = 0
        for i in s:
            if i not in setal:
                setal.add(i)
                que.append(i)
            else:
                z = que.pop(0)
                setal.remove(z)
                while len(que) != 0 and z != i:
                    z = que.pop(0)
                    setal.remove(z)
                que.append(i)
                setal.add(i)
            if len(que) > maxnum:
                maxnum = len(que)
        print(maxnum)
        return maxnum

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值