3. Longest Substring Without Repeating Characters

在这里插入图片描述

题目搬运者

https://leetcode-cn.com/problems/longest-substring-without-repeating-characters/
给定一个字符串s,找出不重复字符的最长子字符串的长度。

暴力解法

因为题目没有给出时间限制,就大胆的用了暴力解法

  1. 先算出字符串里,不同字符的个数 length
  2. 再以字符length 依次递减,遍历字符串
class Solution(object):
    def is_Longestsub(self,s,left,right):
        sub = []
        while left<=right : 
            if s[left] not in sub:
                sub.append(s[left])
            else:
                return False
            left+=1
        return True
            
    def lengthOfLongestSubstring(self, s):
        """
        :type s: str
        :rtype: int
        """
        n = len(s)
        if n==0 :return 0
        sub = []
        for i in range(n):
            if s[i] not in sub:
                sub.append(s[i])
        
        mins = 1
        length= len(sub)
        if length == n: return length
        while  length>mins:
            i =0 
            while i+length<=n : #再这里给自己埋了个坑,写成了小于,而不是小于等于,还是要细心啊。
                if Solution.is_Longestsub(self,s,i,i+length-1):
                    return length 
                i+=1
            length -=1
        return 1
            

滑动窗口解法

  1. 滑动窗口 设置一个hash表,依次添加不重复的字符
  2. 在遇到重复的字符时,只要把队列的左边的元素移出就行了
  3. abcabcbb 进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!
  4. 从abcabcbb 滑动窗口收缩到了从第二个a开始的地方
def lengthOfLongestSubstring(self, s):
        if not s: return 0
        left = 0
        right = 0
        ans = 0
        hashset = set()
        n = len(s)
        length = 0
        for i in range(n):
            while s[i] in hashset:
                hashset.remove(s[left])
                left += 1
                length -= 1
            hashset.add(s[i])
            length += 1
            if ans < length: ans = length
        return ans

时间复杂度:O(n)

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值