Leetcode刷题笔记——python无重复字符的最长子串

本文介绍了一种使用滑动窗口和哈希集合来解决LeetCode中的无重复字符最长子串问题。通过示例解释了算法思路,并提供了手动模拟解题过程和Python代码实现。
摘要由CSDN通过智能技术生成

题目描述:给定一个字符串,请你找出其中不含有重复字符的最长子串的长度。

示例 1:
输入: “abcabcbb”
输出: 3
解释: 因为无重复字符的最长子串是 “abc”,所以其长度为 3。
示例 2:
输入: “bbbbb”
输出: 1
解释: 因为无重复字符的最长子串是 “b”,所以其长度为 1。
示例 3:
输入: “pwwkew”
输出: 3
解释: 因为无重复字符的最长子串是 “wke”,所以其长度为 3。
请注意,你的答案必须是 子串 的长度,“pwke” 是一个子序列,不是子串。

解题思路:这里利用滑动窗口的思想来寻找最大子串的长度,滑动窗口可以利用左右两个指针来实现。左指针代表从当前字符开始的最大子串,左指针的滑动代表新的子串的开始,右指针依次滑动,直到出现重复字符。维持一个全局的int型变量来记录最大子串的长度,对于每一个子串,将其长度与当前max里的值比较,如果更长则从新赋值max,否则保持不变。对于求每个最大子串过程中重复元素的审查,可以借助哈希结构,右指针每向右滑动依次,若该元素不在哈希表中,则将该元素添入哈希表,左指针每向右滑动一次,将滑动的元素移出哈希表。

对于"abcabcbb"手动模拟求解如下:
左指针指向a1的最大子串:(abc)abcbb;max=3
左指针指向b1的最大子串:a(bca)bcbb;max=3
左指针指向c1的最大子串:ab(cab)cbb;max=3
左指针指向a2的最大子串:abc(abc)bb;max=3
左指针指向b2的最大子串:abca(bc)bb;max=3
左指针指向c2的最大子串:abcab(cb)b;max=3
左指针指向b3的最大子串:abcabc(b)b;max=3
左指针指向b4的最大子串:abcabcb(b);max=3
故"abcabcbb"最大子串长度为3

实现如下:

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        sub=set() #维持一个集合求子串
        n=len(s) 
        r,ans=-1,0 #r是右指针,初值-1表示位于字符串的左边,还未开始滑动;ans是最大子串的长度
        for l in range(n): #l为左指针,依次遍历字符串
            if l!=0: #对于第一个字符,l=0,直接移动右指针找子串;对于后面的字符,首先要移动左指针,在哈希表中删除该元素
                sub.remove(s[l-1])
            while r+1<n and s[r+1] not in sub: #右指针没有超出最大边界,且右指针对应的元素不在哈希表中
                sub.add(s[r+1]) #表中加入该元素,即子串中加入该字符
                r+=1 #指针右移
            ans=max(ans,r-l+1) #r-l+1为当前子串的长度,和ans里的值进行比较
        return ans 

提交结果:
在这里插入图片描述

debug笔记:
集合(set)是一个无序的不重复元素序列。
可以使用大括号 { } 或者 set() 函数创建集合,注意:创建一个空集合必须用 set() 而不是 { },因为 { } 是用来创建一个空字典。
集合中添加元素:s.add(x)
集合中删除元素:s.remove(x)
元素是否在集合中:x in s
求集合长度:len(s)

2020.6.18 gohna完成

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值