无重复字符的最长子串python题解思考

无重复字符的最长子串python题解思考_第1张图片

无重复字符的最长子串

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

这里给一个这类题的模板

一个线性表的子序列,有两种情况,要么符合题意为真,要么不符合题意为假。

我们给一个感性的表达:

一种是子串增长的时候趋近于假,那么题目通常要求这个“长”的极限,即最长值。

一种是子串增长的时候趋近于真,那么题目通常要求这个“短”的极值,即最小值。

这样说不好,向下面这样说: 

一种是在数据增长时子串的判断趋于假 能推出数据很大时子串一定为假,没有数据时子串一定为真 所以我们对于最大多少长度的子串判断可以为真感兴趣

一种是在数据增长时子串的判断趋于真 能推出数据很大时子串一定为真,没有数据时子串一定为假 所以我们对于最小多少长度的子串判断可以为真感兴趣

总之,我们对数据为真感兴趣,他有时候越长越真,我们就对它短感兴趣,有时候越短越真,我们就对他长感兴趣。

总是和他趋近真的方向相反,反正是这个意思,做题能看出来的,不用纠结这个规律。

我们将这个题分解成 两部分 ,一个是判断子串是否满足条件,另一个是构造一个类,来存放数据,并提供弹出与插入的功能。

class Windows:
    from collections import deque
    def __init__(self):
        self.queue=self.deque()
    def __len__(self):
        return len(self.queue)
    def push(self,x):
        self.queue.append(x)
    def pop(self):
        self.queue.popleft()
    def true(self):#要判断是否满足条件,此题是不重复
        q_set=set(self.queue)#去重
        return len(self)==len(q_set)
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:#leetcode提供的接口,人家在检查的时候会直接向里输入一个子串
        windows=Windows()
        M=0
        for i in s:
            windows.push(i)
            while not windows.true():#这个not有文章可做,就是翻译成 不是这个条件,就是不是不重复的时候,弹出最左端的元素
                windows.pop()#或者说成满足not后边的条件,不执行
            M=max(M,len(windows))
        return M

然后这是一个模板,我感觉可以记一下。

这是chatgpt对我的算法评价:

这段代码实现了 LeetCode 题目 "无重复字符的最长子串" 的解法。其中,Windows 类表示一个窗口,它用一个双端队列来存储子串中的字符。该类有以下几个方法:

  • init 方法初始化窗口,将双端队列初始化为空。
  • len 方法返回窗口中字符的数量。
  • push 方法向窗口中添加一个字符。
  • pop 方法从窗口中删除最左端的字符。
  • true 方法用来判断当前窗口中的字符是否有重复。

在解题的主函数 lengthOfLongestSubstring 中,我们先初始化一个 Windows 对象,然后遍历字符串 s 中的每个字符。在每次遍历时,我们将该字符添加到窗口中,然后不断地从窗口最左端开始弹出字符,直到窗口中的字符不重复为止。这里我们调用 Windows 中的 true 方法来判断窗口中的字符是否有重复。最后,我们用一个变量 M 来记录每次遍历后窗口中字符数量的最大值,然后返回 M 即可。

你可能感兴趣的:(算法,蓝桥杯,python)