LetCode算法,ChatGPT来救场(今日一学-无重复字符的最长子串)

ChatGPT与letcode

众所周知ChatGPT是一种大型语言模型,使用深度学习技术学习大量的语料库,从而模仿人类语言和思维方式,回答用户的问题
我们那他来辅助letcode刷题,有答疑还有详细的解释,岂不美哉。

chatGTP当老师

题目描述 来自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)更优。因此,当需要在一个字符串或数组中寻找某个特定模式时,可以尝试使用滑动窗口算法。

每日一学结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值