LeetCode_题三_无重复长度字符串

Leetcode 算法题

3.无重复字符的最长字串

给出一个不限长的字符串,请你找出不含有重复字符串的最长字串
实例:

输入: "abcabcbb"
输出: 3 
解释: 因为无重复字符的最长子串是 "abc",所以其长度为 3。

输入: "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b",所以其长度为 1

输入: "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke",所以其长度为 3。
     请注意,你的答案必须是 子串 的长度,"pwke" 是一个子序列,不是子串。
思路一:滑动窗口解法

什么是滑动窗口?

其实就是一个队列,比如例题中的 abcabcbb,进入这个队列(窗口)为 abc 满足题目要求,当再进入 a,队列变成了 abca,这时候不满足要求。所以,我们要移动这个队列!

如何移动?

我们只要把队列的左边的元素移出就行了,直到满足题目要求!

一直维持这样的队列,找出队列出现最长的长度时候,求出解!

时间复杂度:O(n)

细节分析

(a)bcabcbb开始的最长字符串为a(abc)abcbb
a(b)cabcbb 开始的最长字符串为a(bca)bcbb
ab(c)abcbb开始的最长字符串为ab(cab)cbb
abc(a)bcbb开始的最长字符串为abc(abc)bb
abca(b)cbb 开始的最长字符串为abca(bc)bb
abcab(c)bb开始的最长字符串为abcab(cb)b
abcabc(b)b开始的最长字符串为abcabc(b)b
abcabcb(b)开始的最长字符串为abcabcb(b)

代码实现
class Solution:
    def lengthOfLongestSubstring(self, s: str) -> int:
        if not s:
            return 0
        if len(s) < 1:
            return len(s)
        left = 0
        n = len(s)
        cur_len = 0
        max_len = 0
        lookup = set()
        for i in range(n):
            cur_len += 1
            while s[i] in lookup:
                lookup.remove(s[left])
                left += 1
                cur_len -= 1
            if cur_len > max_len:
                max_len = cur_len
            lookup.add(s[i])
        return max_len
python基础知识点分析

关于python的数据结构set(),list(),dict()的查找效率问题
查找效率从大到小:set()>dict()>list()
其时间复杂度依次为:O(logn)、O(logn)、O(n)
感兴趣的同学可以参考此篇文章——传送门

算法耗时:

在这里插入图片描述

思路二:利用字典进行索引比较
class Solution:
def lengthOfLongestSubstring(self, s: str) -> int:
        st = {}
        i,ans = 0,0
        for j in range(len(s)):
            if s[j] in st:
                i = max(st[s[j]],i)
            ans = max(ans,i)
            st[s[j]] = j
        return ans

测试结果:
在这里插入图片描述

这里贴上leetcode网址:传送门
上一题题解:传送门

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值