力扣hot100 3 无重复字符的最长子串的长度

题目介绍:

在这里插入图片描述
在这里插入图片描述

题解1:(自己写的暴力解法:时间复杂度 O ( N 2 ) O(N^2) O(N2)

思路:建立临时列表,存储不重复的连续字符,作为移动窗口。判断下一项是否为重复项,不是的话,将不重复项加入到临时列表(扩大移动窗口);是的话,找到临时表中重复项的下标,根据下标 sign 重新设置临时列表(移动窗口)为 临时列表[sign+1 : ] 。然后更新 临时列表长度值(count) , 更新 max 值。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        temp = [] # 临时列表,存储不重复的连续字符
        n = len(s)
        if n==0: # 如果长度为0 ,返回0 ,程序结束
            return 0
        temp.append(s[0]) # 第一个值一定是不重复的 
        max = count = 1
        for j in range(1,n):
            if s[j] not in temp: # 遇到非重复项加到temp中,长度+1
                temp.append(s[j])
            else:
                sign = temp.index(s[j]) # 获取重复元素的下标
                temp = temp[sign+1:] # 移动窗口,将重复元素排除在外
                temp.append(s[j]) # 将重复值加入temp
            
            # 更新count值          
            count = len(temp) 
            # 更新max值
            if count > max:
                max = count
        return max

题解2*:(官方解法:时间复杂度 O ( N ) O(N) O(N)

重点:关于使用 not in 的时间复杂度分析:

取决于本身的存储结构,如果是集合,字典的话,使用哈希散列表存储的,使用not in 判断,时间复杂度只有O(1), 要是用列表做 not in 判断,时间复杂度 就还是 O(N) ; 所以官方题解还是很值得学习的。

题解链接

思路:依次遍历字符串的元素,计算以该元素为首元素的最长不重复序列的长度。用临时变量保存当前最大长度,遍历完之后返回最大长度即可。

class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        # 哈希集合,记录每个字符是否出现过
        occ = set()
        n = len(s)
        # 右指针,初始值为 -1,相当于我们在字符串的左边界的左侧,还没有开始移动
        rk, ans = -1, 0
        for i in range(n):
            if i != 0:
                # 左指针向右移动一格,移除一个字符
                occ.remove(s[i - 1])
            while rk + 1 < n and s[rk + 1] not in occ:
                # 不断地移动右指针
                occ.add(s[rk + 1])
                rk += 1
            # 第 i 到 rk 个字符是一个极长的无重复字符子串
            ans = max(ans, rk - i + 1)
        return ans

题解三*:动态规划思想解(待补充)

随便找了一个题解链接,还未验证错误

在这里插入代码片
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值