给定一个字符串 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 即可。