众所周知ChatGPT是一种大型语言模型,使用深度学习技术学习大量的语料库,从而模仿人类语言和思维方式,回答用户的问题
我们那他来辅助letcode刷题,有答疑还有详细的解释,岂不美哉。
题目描述 来自letcode
给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。
示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。
示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1。
示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
提示:
0 <= s.length <= 5 * 104
s 由英文字母、数字、符号和空格组成
ChatGPT
好的,这个问题可以用滑动窗口(Sliding Window)算法来解决。具体思路如下:
1.定义两个指针left和right,分别指向最长子串的左右边界,初始值都为0。
2.遍历字符串s,每次将right指针向右移动一位,并判断移动后的子串是否有重复字符。如果没有重复字符,则更新最长子串的长度,并将right指针向右移动;如果有重复字符,则将left指针向右移动一位,并重新判断子串是否有重复字符。
3.重复第2步,直到right指针遍历完整个字符串s。
下面是Python代码实现:
def lengthOfLongestSubstring(s):
n = len(s)
hash_set = set()
max_len = 0
left = 0
right = 0
while right < n:
if s[right] not in hash_set:
hash_set.add(s[right])
right += 1
max_len = max(max_len, right - left)
else:
hash_set.remove(s[left])
left += 1
return max_len
在代码实现中,我们使用了一个集合(Set)来存储当前子串中的字符。每次遍历时,我们将右指针向右移动一位,并判断右指针所指向的字符是否在集合中。如果不在集合中,将该字符加入集合中,并更新最长子串的长度;如果在集合中,将左指针向右移动一位,并将集合中对应的字符删除。
如果您理解了这个问题的解决方案,可以尝试解决LeetCode上的另一个问题:最小覆盖子串。这个问题是在给定两个字符串s和t的情况下,在s中找到包含t所有字符的最短子串。您可以使用类似的方法解决这个问题。
解释说明
使用滑动窗口算法来解决这道问题的原因是,我们需要在一个字符串中找出一个最长的不包含重复字符的子串,因此我们可以用滑动窗口算法来维护一个窗口,使得窗口中的字符串满足条件(即不包含重复字符)。
滑动窗口算法是一种在字符串或数组上快速寻找特定模式的算法,它通过维护一个窗口,每次移动窗口的左右指针,来寻找符合特定条件的子串或子数组。具体来说,滑动窗口算法分为以下几个步骤:
1.定义两个指针left和right,分别指向最长子串的左右边界,初始值都为0。
2.向右移动right指针,并检查当前窗口中的子串是否满足条件。如果不满足条件,则左移left指针,缩小窗口,直到满足条件为止。
3.重复步骤2,直到right指针到达字符串的末尾。
因为滑动窗口算法每次都只需要移动一个指针,因此时间复杂度是O(n),比暴力枚举的时间复杂度O(n^2)更优。因此,当需要在一个字符串或数组中寻找某个特定模式时,可以尝试使用滑动窗口算法。
每日一学结束